残りのアロー機構にはかなり慣れましたが、ループがどのように機能するかわかりません。それは私には魔法のように思えますが、それは私の理解にとって悪いことです. mfixも理解できません。orブロックで使用rec
するコードを見ると、混乱します。通常のモナド コードまたはアロー コードを使用すると、計算をステップ実行して、頭の中で何が起こっているかの操作上の図を保持できます。になったら、どの写真を残せばいいのかわからない!私は立ち往生し、そのようなコードについて推論することはできません.proc
do
rec
私が理解しようとしている例は、矢印に関するロス・パターソンの論文、回路に関するものです。
counter :: ArrowCircuit a => a Bool Int
counter = proc reset -> do
rec output <- returnA -< if reset then 0 else next
next <- delay 0 -< output+1
returnA -< output
この例を理解すれば、ループ全般を理解できるようになり、mfix を理解する上で非常に役立つと思います。彼らは本質的に私には同じように感じますが、おそらく私が見逃している微妙な点がありますか? とにかく、私が本当に賞賛したいのは、そのようなコード片の操作図です。これにより、「通常の」コードのように頭の中でステップスルーできます。
編集:Pigworkerの回答のおかげで、recなどの要求が満たされることについて考え始めました。例を挙げるcounter
と、 rec ブロックの最初の行は という値を要求しますoutput
。output
これは、操作上、ボックスを作成し、ラベルを付け、 rec ブロックにそのボックスを埋めるように依頼することを想像しています。そのボックスを満たすために、returnA に値をフィードしますが、その値自体は と呼ばれる別の値を要求しますnext
。この値を使用するには、rec ブロックの別の行で要求する必要がありますが、今のところ、rec ブロックのどこで要求されているかは問題ではありません。
次の行に移動すると、 というラベルの付いたボックスが見つかり、next
別の計算でそれを満たすように要求します。さて、この計算には最初のボックスが必要です! ボックスを指定しますが、その中には値がありません。したがって、この計算で の内容が要求されるとoutput
、無限ループに陥ります。さいわい、delay はボックスを受け取りますが、ボックスの中を見ずに値を生成します。これで塗りつぶさnext
れ、塗りつぶしが可能になりますoutput
。これでoutput
、この回路の次の入力が処理されると、前のボックスはその値を持ち、次の 、したがってoutput
次の を生成するために要求される準備が整います。next
output
それはどのように聞こえますか?