10

私はOcamlでhaskellのようなdo表記のcamlp4拡張機能に取り組んでおり、GHCが再帰的なdo-bindings(-XDoRecで有効化)をコンパイルする方法を理解しようとしています。
モナディック不動点コンビネータが厳密な言語(Ocaml / F#/ SML / ...など)で存在することは可能でしょうか?
はいの場合、どのように見えますか?とても便利でしょうか?

4

1 に答える 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 に答える