一次制約とは
最初に、矢印に対する 1 次制約の意味を説明します。矢印の desugar の方法により、矢印 do 表記で矢印コマンドが予期される場合、ローカルにバインドされた名前を使用することはできません。
以下に例を示します。
proc x -> f -< x + 1
desugar は 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)) a
orを定義することは可能ですか?accumHold' :: SF (a,Event (a -> a)) -> a
注:ArrowApply
forのインスタンスはありませんSF
。私の理解では、定義することも意味がありません。詳細については、「アローを使用したプログラミング」を参照してください。