Следуя отличному ответу в этом сообщении, я пытаюсь получите рабочий пример ArrowLoop
, в котором не используются стрелки. Мне неудобно использовать обозначения стрелок, пока я полностью не пойму, как стрелки работают под капотом. При этом я создал небольшую программу, которая, основываясь на моем (ограниченном) понимании Arrows, должна работать. Однако в конечном итоге он завершается ужасным <<loop>>
исключением:
module Main where
import Control.Wire
import FRP.Netwire
farr :: SimpleWire (Int, Float) (String, Float)
farr = let
fn :: Int -> Float -> ((String, Float), SimpleWire (Int, Float) (String, Float))
fn i f = (("f+i: " ++ (show (fromIntegral i + f)), f + 0.1), loopFn)
loopFn :: SimpleWire (Int, Float) (String, Float)
loopFn = mkSFN $ \(i, f) -> fn i f
in
mkSFN $ \(i, _) -> fn i 0.0
main :: IO ()
main = do
let sess = clockSession_ :: Session IO (Timed NominalDiffTime ())
(ts, sess2) <- stepSession sess
let wire = loop farr
(Right s, wire2) = runIdentity $ stepWire wire ts (Right 0)
putStrLn ("s: " ++ s)
(ts2, _) <- stepSession sess2
let (Right s2, _) = runIdentity $ stepWire wire2 ts (Right 1)
putStrLn ("s2: " ++ s2)
Моя интуиция подсказывает мне, что <<loop>>
исключение обычно возникает, когда вы не передаете начальное значение циклу. Разве я не сделал этого со строкой, содержащей fn i 0.0
? Вывод не согласуется:
$ ./test
s: f+i: 0.0
test.exe: <<loop>>
Кто-нибудь знает, что я делаю не так?