Рассмотрим следующий код:Использование `periodic` в NetWire 5
-- this defines what our 'state' will be
data Direction = North | East | South | West deriving (Eq, Show, Enum)
data State = State Int Bool Direction deriving (Show)
initialState :: State
initialState = State 0 True North
-- a simple routine to change a state and count the number of
-- changes
nextState :: State -> State
nextState (State i _ West) = State (i+1) False South
nextState (State i _ North) = State (i+1) True East
nextState (State i b s) = State i b $ (if b then succ else pred) s
-- a wire with local state
stateWire :: Wire s() m a State
stateWire = stateWireFrom initialState
where
stateWireFrom s = mkSFN $ \_ -> (nextState s, stateWireFrom (nextState s))
-- let's run the wire!
main = testWire clockSession_ stateWire
Как вы можете себе представить, testWire
будет работать провод так же быстро, как он может и распечатать вывод на экран. Но что, если я хочу запустить мой провод каждые 2 секунды? Глядя на документы, periodic
может быть решение:
-- Since periodic generates events, asSoonAs is used to 'unwrap' the Event
main = testWire clockSession_ (asSoonAs . periodic 2 . stateWire)
Это почти работы. Выход кажется статичным в течение примерно 2 секунд, но когда он обновляется, становится ясно, что провод работал, пока выход был остановлен. Может быть, я должен сделать наоборот?
-- Now, this does make more sense to me...
main = testWire clockSession_ (stateWire . periodic 2)
Однако конечный результат в точности совпадает с моей первой попыткой. Что мне здесь не хватает?
EDIT: См. this answer для (младшей) альтернативы принятому ответу.
Я бы рекомендовал вам опубликовать свое редактирование вместо ответа; Ответ на ваши собственные вопросы разрешен в stackoverflow и имеет больше смысла, чем ответ на вопрос. Кроме того, вероятно, нет необходимости копировать мой ответ, если вы не хотите подчеркнуть некоторую разницу между ними. – Cubic