私はOcamlでhaskellのようなdo notationのcamlp4拡張機能を開発しています.GHCがどのように再帰的do-bindingsをコンパイルするかを理解しようとしています(-XDoRecで有効)。
モナディック固定点コンビネータが厳密な言語(Ocaml/F#/ SML/...のような)で存在する可能性はありますか?
はいの場合、どのように表示されますか?それは非常に便利だろうか?MonadFix厳密な言語で
10
A
答えて
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つの論文は関連しています
- Syntax Matters: Writing abstract computations in F#
- Initializing Mutually Referential Abstract Objects: The Value Recursion Challenge
最初のものはどのようにF#のを記述する計算式構文が廃止されました(どのようにしてDelay
が挿入されたのですか?一般的に、F#が遅延計算と熱心な計算をどのように組み合わせてエフェクトを組み合わせるか)、2番目の方法はF#の処理方法を説明します上記のones
値のような値を持つ宣言。
関連する問題
- 1. 厳密に制限されたインタプリタ言語での作業
- 2. 言語の厳密なスーパーセットで書かれたプログラムは多言語としてカウントされますか?
- 3. 厳密に型指定された言語とは何ですか?
- 4. 高速、コンパクト、ストリーミング、多言語、厳密に型指定されたシリアライズフォーマット
- 5. テキストフィールドの厳密な検証
- 6. XHTML厳密な検証
- 7. 厳密モードのないJSON.parse
- 8. ストライプの厳密なURLバインド
- 9. PHPでの厳密な比較
- 10. PFXでの厳密な名前付け
- 11. スフィンクス:非厳密クエリ
- 12. Cのどちらの方言がObjective-Cの「厳密なスーパーセット」ですか?
- 13. 厳密なモードで予約語「let」が予期せず使用される
- 14. 弾性検索厳密なハイライト
- 15. C++の厳密なtypedef用のイディオム
- 16. 厳密なエイリアシングのパフォーマンス上のメリット
- 17. LINQの厳密な型付け
- 18. Haskellの厳密なデータ構造のライブラリ
- 19. Xampp localhost厳密な規格のエラー
- 20. データ型の厳密なフィールドのメリット
- 21. このインスタンスのarguments.calleeの厳密なモード
- 22. Python厳密に型リスト
- 23. xhtml過渡対厳密?
- 24. IE厳密モードのActiveXコントロールでのフリッカー
- 25. uintが厳密に正であるか
- 26. Kivyは厳密にGUIフレームワークですか?
- 27. (厳密に)コールスタックはどこですか?
- 28. Actionscript 3.0:オブジェクトウォーカーを厳密モードで表示
- 29. QMLの「厳密」モードですか?
- 30. 厳密FMAPは、怠惰なIOでないモナド
だから、まったく厳密にはできません。すべての関数型言語はいくつかの怠惰の概念を持っているので(関数、クロージャー、変数を主に使用します)、遅延型構造を介して "厳密な言語"で可能です。 –
あなたのモナドが抽象型の背後にあると、怠惰がそこにあることがよくありますが、OCamlはそれを悪用することはできません - 'このような表現は 'let rec'の右側には許されません。そのような場合には、あなたは偽の 'unit'引数を使う必要があります(または、memoizationが必要な場合はおそらく"怠け者 "です...) – lukstafi