私は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. haskellでの厳密なまたは非厳密な乗算?
- 4. 厳密に型指定された言語とは何ですか?
- 5. PHP 7でシバンと厳密な型宣言を使用
- 6. 高速、コンパクト、ストリーミング、多言語、厳密に型指定されたシリアライズフォーマット
- 7. テキストフィールドの厳密な検証
- 8. 厳密なヌルチェックのオーバーライド
- 9. XHTML厳密な検証
- 10. Symfonyサービスの厳密なパラメータ
- 11. PHPUnit assertEquals厳密な型チェック
- 12. 厳密モードのないJSON.parse
- 13. 厳密な等価比較
- 14. Angularjsの厳密なモデル値
- 15. ストライプの厳密なURLバインド
- 16. 厳密なエイリアス違反
- 17. 厳密なJSONオブジェクトのコンテンツタイプ
- 18. 厳密なエイリアシング違反ですか?
- 19. PHPでの厳密な比較
- 20. PFXでの厳密な名前付け
- 21. プログレスバーで厳密なモードを使用
- 22. スフィンクス:非厳密クエリ
- 23. スウィフトの厳密さ
- 24. Cのどちらの方言がObjective-Cの「厳密なスーパーセット」ですか?
- 25. 厳密なモードで予約語「let」が予期せず使用される
- 26. 厳密なエイリアシングのパフォーマンス上のメリット
- 27. Xampp localhost厳密な規格のエラー
- 28. Pythonの辞書の厳密な比較
- 29. 厳密な数値入力フィールド
- 30. IDbCommandTreeInterceptor厳密なDbContextの場合
だから、まったく厳密にはできません。すべての関数型言語はいくつかの怠惰の概念を持っているので(関数、クロージャー、変数を主に使用します)、遅延型構造を介して "厳密な言語"で可能です。 –
あなたのモナドが抽象型の背後にあると、怠惰がそこにあることがよくありますが、OCamlはそれを悪用することはできません - 'このような表現は 'let rec'の右側には許されません。そのような場合には、あなたは偽の 'unit'引数を使う必要があります(または、memoizationが必要な場合はおそらく"怠け者 "です...) – lukstafi