私が理解していることから、このタイプの関数が多数あり、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を打ち負かします。これはモナド構造の制限ですか?それらを連鎖させることさえできますか?この問題を解決するための標準的な方法は何ですか?
@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コミュニティは今でもいくつかの新しい解決策を探しています。今でも、EffやPolysemyのようなライブラリの開発があり、私が知る限り、より自由な/ effモナドですが、組み込みのコンパイラサポートがあります。今のところ、せいぜい、事前に集約された効果を決定するか、TTFIとMTLを介して選択を延期することができます。異なるモナドを取り、それらをひとまとめにするだけです...方法を考えて書くことなしには不可能です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加