4

この投稿の優れた回答のリードに従って、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>>

私が間違っていることを誰かが知っていますか?

4

1 に答える 1