一次制約とは
最初に、矢印に対する 1 次制約の意味を説明します。矢印の desugar の方法により、矢印 do 表記で矢印コマンドが予期される場合、ローカルにバインドされた名前を使用することはできません。
以下に例を示します。
proc x -> f -< x + 1desugar は to にarr (\x -> x + 1) >>> f、同様proc x -> g x -< ()に desugar toarr (\x -> ()) >>> g xになります。ここで、2 番目xは自由変数です。GHC ユーザーガイドはこれを説明し、矢印がモナドでもある場合、インスタンスを作成してこれを回避するためにArrowApply使用できると述べていますapp。のようなものが にproc x -> g x -<< ()なりarr (\x -> (g x, ())) >>> appます。
私の質問
Yampa は、accumHoldこのタイプの関数を定義します: a -> SF (Event (a -> a)) a. 矢印のこの一次制限により、次の関数を書くのに苦労しています。
accumHoldNoiseR :: (RandomGen g, Random a) => (a,a) -> g -> SF (Event (a -> a)) a
accumHoldNoiseR r g = proc f -> do
n <- noiseR r g -< ()
accumHold n -< f
上記の定義nは、脱糖後にスコープ外であるため機能しません。
または、同様に、ペアの最初の部分がにSF渡される初期値であることを意味するこの関数accumHold
accumHold' :: SF (a,Event (a -> a)) -> a
accumHold' = ...
私が見逃しているコンビネーターやトリックはありますか? それとも、ArrowApplyインスタンスなしでこれらの定義を書くことはできませんか?
tl;dr: yampa でaccumHoldNoiseR :: (RandomGen g, Random a) => (a,a) -> g -> SF (Event (a -> a)) aorを定義することは可能ですか?accumHold' :: SF (a,Event (a -> a)) -> a
注:ArrowApply forのインスタンスはありませんSF。私の理解では、定義することも意味がありません。詳細については、「アローを使用したプログラミング」を参照してください。