遵循这篇文章中出色答案的引导中出色答案的引导下,我试图获得一个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>>
有谁知道我做错了什么?