【发布时间】:2014-08-05 04:15:54
【问题描述】:
按照this post 中出色答案的引导,我试图获得一个不使用箭头符号的ArrowLoop 工作示例。在我完全理解箭头在引擎盖下的工作原理之前,我对使用箭头表示法感到不舒服。话虽如此,我已经构建了一个基于我对箭头的(有限)理解的小程序应该可以工作。然而,它最终以可怕的<<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>>
有谁知道我做错了什么?
【问题讨论】:
-
> 是 GHC 告诉您它已检测到评估循环的方式;一个表达式,在 GHC 评估期间它会返回到相同的 thunk。
-
好吧,我想进一步解释一下为什么会发生这种情况,因为我不希望它发生。
标签: haskell frp arrows netwire