この投稿の優れた回答のリードに従って、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>>
私が間違っていることを誰かが知っていますか?