異なるモナドを返すモナド関数を一般的に構成するにはどうすればよいですか?

博士号

私が理解していることから、このタイプの関数が多数あり、f: a -> m[b]それらがすべて戻り値をラップしている限り、次の方法でそれらmをチェーンできるはずですdo/bind/flatMap

f: A -> M[B]
g: B -> M[C]
h: C -> M[D]

これは、>>=またはflatMap(Scala)を介してチェーンするのはかなり簡単です。

モナドの「ボックス」が異なるが、内部の値は「連鎖可能」である関数をどのように構成するのでしょうか。

f: A -> M[B]
g: B -> N[C]
h: C -> P[D]

私はこの事件を見たり読んだりしたことがliftなく、モナドができることは理解していますが、それは目的のIMOを打ち負かします。これはモナド構造の制限ですか?それらを連鎖させることさえできますか?この問題を解決するための標準的な方法は何ですか?

Mateusz Kubuszok

@LuisMiguelMejíaSuárezが言ったように、モナドは作曲しません。あなたが持っているならM[A]N[B]そしてO[C]あなたはそれらをただ取って組み合わせることができないなら...正確に何に?

それらを組み合わせてのようなものにすることをお勧めしM[N[O[D]]]ます。しかしflatMap、最も外側のモナドでのみ機能します。計算をすべてのレイヤーで実行する場合は、最も外側を除く各レイヤーにモナド変換子が必要になります。

その結合されたタイプは、箱から出して生成できますか?またM[N[O[D]]]、と同じではなくO[N[M[D]]]、決定論的な方法で順序を決定する何らかの方法があるはずだからではありません

あなたはに自然変換を渡すことができTarget[_]ます変換を聞かせタイプ、のそれぞれからM[A]N[B]およびO[C]へのTarget[A]Target[B]そしてTarget[C]そしてモナドとして、それらを組み合わせて、それは簡単にはほど遠いです。

そして、代わりに特定を使用してのアプローチがあったM[_]N[_]O[_]- 、あなたはパラメータとして渡すには、それを入力し、実行するために、パラメータとしてターゲットを渡し、何とか追加することができ、エフェクトFreer、その最適化された形Effと代数的効果は、Aを作成するようですtype =レベルのエフェクトのリストとそれらの追加と削除(1つのレイヤーを解釈/実行することによる)。私が知る限り、これらの試みは、彼らが約束したことを一般的に行うことを可能にしたという点で成功しました...しかし、精神的なオーバーヘッドにより、大多数の人々にとってそれらは非常に非実用的で理解しにくいものになりました。間違いなく、簡単ではありません。また、実際には重要であるのに、効果を解釈する順序は重要ではないというふりをすることがあるため、誤解を招くこともあります。

現在、エフェクトをスタックする必要がある場合は、タグレスファイナルを使用して、あらゆる場所で1つの合成エフェクトを使用する可能性が高くなります。MTL型クラスを使用して、モナドインターフェイスの横に状態/リーダー/ライターなどの機能を提供します。また、エフェクト間で変換する必要がある場合は、自然変換を渡す必要があります。

要約すると、一般的にこの問題は解決されておらず、Haskellコミュニティは今でもいくつかの新しい解決策を探しています。今でも、EffPolysemyのようなライブラリの開発があり、私が知る限り、より自由な/ effモナドですが組み込みのコンパイラサポートがあります。今のところ、せいぜい、事前に集約された効果を決定するか、TTFIとMTLを介して選択を延期することができます。異なるモナドを取り、それらをひとまとめにするだけです...方法を考えて書くことなしには不可能です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Swiftで複数の引数を持つ一般的なメモ化関数を作成するにはどうすればよいですか?

分類Dev

一般的なワイルドカードからのリターンをモックするにはどうすればよいですか

分類Dev

関数分布のmeanとstddevを返す一般的なPythonクラスメソッドを作成するにはどうすればよいですか?

分類Dev

一般的な固定長配列で関数を定義するにはどうすればよいですか?

分類Dev

一般的な観察可能な構成の繰り返しを回避するにはどうすればよいですか?

分類Dev

この一般的なBox関数の入力を改善するにはどうすればよいですか?

分類Dev

非同期関数にモナドバインドを行うにはどうすればよいですか?

分類Dev

Scala:操作のリストを無料のモナドに構成するにはどうすればよいですか?

分類Dev

System.IO.Unsafeなしでモナドの値を取得するにはどうすればよいですか?

分類Dev

一般的な `buildscript` Gradleコードを共有するにはどうすればよいですか?

分類Dev

kotlinの一般的なonTouchEventメソッドを実行するにはどうすればよいですか?

分類Dev

Django:一般的なフォームの送信部分を関数に編成するにはどうすればよいですか?

分類Dev

異なる構成のMakefileビルド出力を分離するにはどうすればよいですか?

分類Dev

matplotlibで一般的な数の軸を美的に表示するにはどうすればよいですか?

分類Dev

「厳密な使用」モードで連鎖関数を作成するにはどうすればよいですか?

分類Dev

これらのメソッドを一般的にするにはどうすればよいですか?

分類Dev

Javaでstdinモードをバイナリに設定するにはどうすればよいですか?

分類Dev

このEcto / Elixir関数を一般化するにはどうすればよいですか?

分類Dev

独自の理解に準拠したscalaモナドを作成するにはどうすればよいですか?

分類Dev

[a]を返す関数をモノイドを返す関数に変えるにはどうすればよいですか?

分類Dev

トランスフォーマスタックのベースにあるモナドに応じて動作が異なる関数を作成するにはどうすればよいですか?

分類Dev

オブジェクト配列の値配列を返す関数を一般的に入力するにはどうすればよいですか?

分類Dev

Ubuntu 20.04で自動ナイトモードを設定するにはどうすればよいですか?

分類Dev

ScalaでReaderとWriterのモナドを使用するにはどうすればよいですか?

分類Dev

Parsecのモナド内でIOを実行するにはどうすればよいですか?

分類Dev

ReaderT内でリストモナドを使用するにはどうすればよいですか?

分類Dev

関数のデータ/モナドモジュールを使用してラケットに「関数」モナドを実装するにはどうすればよいですか?

分類Dev

TypeReferenceの一般的な引数を取得するにはどうすればよいですか?

分類Dev

科学的記数法なしで数値を出力するようにOctaveターミナルを構成するにはどうすればよいですか?

Related 関連記事

  1. 1

    Swiftで複数の引数を持つ一般的なメモ化関数を作成するにはどうすればよいですか?

  2. 2

    一般的なワイルドカードからのリターンをモックするにはどうすればよいですか

  3. 3

    関数分布のmeanとstddevを返す一般的なPythonクラスメソッドを作成するにはどうすればよいですか?

  4. 4

    一般的な固定長配列で関数を定義するにはどうすればよいですか?

  5. 5

    一般的な観察可能な構成の繰り返しを回避するにはどうすればよいですか?

  6. 6

    この一般的なBox関数の入力を改善するにはどうすればよいですか?

  7. 7

    非同期関数にモナドバインドを行うにはどうすればよいですか?

  8. 8

    Scala:操作のリストを無料のモナドに構成するにはどうすればよいですか?

  9. 9

    System.IO.Unsafeなしでモナドの値を取得するにはどうすればよいですか?

  10. 10

    一般的な `buildscript` Gradleコードを共有するにはどうすればよいですか?

  11. 11

    kotlinの一般的なonTouchEventメソッドを実行するにはどうすればよいですか?

  12. 12

    Django:一般的なフォームの送信部分を関数に編成するにはどうすればよいですか?

  13. 13

    異なる構成のMakefileビルド出力を分離するにはどうすればよいですか?

  14. 14

    matplotlibで一般的な数の軸を美的に表示するにはどうすればよいですか?

  15. 15

    「厳密な使用」モードで連鎖関数を作成するにはどうすればよいですか?

  16. 16

    これらのメソッドを一般的にするにはどうすればよいですか?

  17. 17

    Javaでstdinモードをバイナリに設定するにはどうすればよいですか?

  18. 18

    このEcto / Elixir関数を一般化するにはどうすればよいですか?

  19. 19

    独自の理解に準拠したscalaモナドを作成するにはどうすればよいですか?

  20. 20

    [a]を返す関数をモノイドを返す関数に変えるにはどうすればよいですか?

  21. 21

    トランスフォーマスタックのベースにあるモナドに応じて動作が異なる関数を作成するにはどうすればよいですか?

  22. 22

    オブジェクト配列の値配列を返す関数を一般的に入力するにはどうすればよいですか?

  23. 23

    Ubuntu 20.04で自動ナイトモードを設定するにはどうすればよいですか?

  24. 24

    ScalaでReaderとWriterのモナドを使用するにはどうすればよいですか?

  25. 25

    Parsecのモナド内でIOを実行するにはどうすればよいですか?

  26. 26

    ReaderT内でリストモナドを使用するにはどうすればよいですか?

  27. 27

    関数のデータ/モナドモジュールを使用してラケットに「関数」モナドを実装するにはどうすればよいですか?

  28. 28

    TypeReferenceの一般的な引数を取得するにはどうすればよいですか?

  29. 29

    科学的記数法なしで数値を出力するようにOctaveターミナルを構成するにはどうすればよいですか?

ホットタグ

アーカイブ