2013-03-21 19 views
10

私はOcamlでhaskellのようなdo notationのcamlp4拡張機能を開発しています.GHCがどのように再帰的do-bindingsをコンパイルするかを理解しようとしています(-XDoRecで有効)。
モナディック固定点コンビネータが厳密な言語(Ocaml/F#/ SML/...のような)で存在する可能性はありますか?
はいの場合、どのように表示されますか?それは非常に便利だろうか?MonadFix厳密な言語で

答えて

14

(ハスケルdoに関連した)F#の計算式の構文は再帰をサポートしています。計算ビルダーは、他のモナド(またはMonadPlusの)の操作に加えて、Delay操作をサポートする必要があるため

let rec ones = seq { 
    yield 1 
    yield! ones } 

これはサポートされています。上の評価される遅延計算に

let rec ones = 
    seq.Combine 
    (seq.Yield(1), 
     seq.Delay(fun() -> seq.YieldFrom(ones))) 

Delayのタイプは、一般的に、(unit -> M<'T>) -> M<'T>であり、トリックは、それが効果(または即時再帰参照)との演算をラップすることである:コードのようなものに変換されデマンド。

あなたはメカニズムがF#でどのように機能するかについての詳細を知りたい場合は、以下の2つの論文は関連しています

最初のものはどのようにF#のを記述する計算式構文が廃止されました(どのようにしてDelayが挿入されたのですか?一般的に、F#が遅延計算と熱心な計算をどのように組み合わせてエフェクトを組み合わせるか)、2番目の方法はF#の処理方法を説明します上記のones値のような値を持つ宣言。

+0

だから、まったく厳密にはできません。すべての関数型言語はいくつかの怠惰の概念を持っているので(関数、クロージャー、変数を主に使用します)、遅延型構造を介して "厳密な言語"で可能です。 –

+0

あなたのモナドが抽象型の背後にあると、怠惰がそこにあることがよくありますが、OCamlはそれを悪用することはできません - 'このような表現は 'let rec'の右側には許されません。そのような場合には、あなたは偽の 'unit'引数を使う必要があります(または、memoizationが必要な場合はおそらく"怠け者 "です...) – lukstafi

関連する問題