私はOcamlでhaskellのようなdo表記のcamlp4拡張機能に取り組んでおり、GHCが再帰的なdo-bindings(-XDoRecで有効化)をコンパイルする方法を理解しようとしています。
モナディック不動点コンビネータが厳密な言語(Ocaml / F#/ SML / ...など)で存在することは可能でしょうか?
はいの場合、どのように見えますか?とても便利でしょうか?
1 に答える
14
F#計算式構文(Haskellに関連do
)は再帰をサポートします:
let rec ones = seq {
yield 1
yield! ones }
これがサポートされるのは、計算ビルダーがDelay
他のモナディック(またはモナドプラス)操作に加えて操作をサポートする必要があるためです。コードは次のように変換されます。
let rec ones =
seq.Combine
( seq.Yield(1),
seq.Delay(fun () -> seq.YieldFrom(ones)) )
のタイプはDelay
一般にで(unit -> M<'T>) -> M<'T>
あり、トリックは、効果(または即時再帰参照)を使用した計算を、要求に応じて評価される遅延計算にラップすることです。
F#でメカニズムがどのように機能するかについて詳しく知りたい場合は、次の2つの論文が関連しています。
1つ目は、F#計算式の構文がどのように脱糖されるか(およびDelay
挿入される方法-そして一般に、F#が遅延計算と熱心な計算を効果と組み合わせる方法)を説明し、2つ目はF#が上記の値のlet rec
ように値を使用して宣言を処理する方法を説明しones
ます。
于 2013-03-21T17:00:40.807 に答える