私はMaybeとモナドのどちらの型でも演奏していました(連鎖、戻り値による条件付き関数の適用、連鎖関数が失敗したエラーメッセージの返送など)。だから私はモナドを使って同じことを達成することができるように思えます。だから私の質問は、それらの間の実用的または概念的な違いはどこですか?なぜモナドでモナドが必要なのでしょうか
答えて
もちろん、Maybe a
はEither Unit a
に同形です。事は、彼らは多くの場合、意味的に異なるものを表すために使用されていることである、NoSuchElementException
null
を返すと投げの違いのようなビット:
Nothing
/None
は「期待」しながら、何かの欠落Left e
を表し、何らかの理由でそれを得る際のエラーを示します。我々は欠損値(DBNULL
)の可能性との接続に問題、DBMSの両方を発現query :: Either DBError (Maybe String)
:私たちも何かに2を組み合わせたかもしれない、と述べた
、または何でも(より良いデザインはないと言っているわけではありませんが、あなたはその点を知っています)。
境界が流動的な場合もあります。 saveHead :: [a] -> Maybe a
の場合、エラーの予想される可能性が関数の目的でコード化されていると言えるかもしれませんが、saveDivide
はFloat -> Float -> Either FPError Float
またはFloat -> Float -> Maybe Float
としてエンコードされているかもしれません(やはりちょっとした愚かな例...) 。
疑いで、最良のオプションは、(data QueryResult = Success String | Null | Failure DBError
のような)セマンティックエンコードでカスタム結果ADTを使用すると、それは「伝統的期待」される単純な例にMaybe
を好むように思われる場合(ただしだろう主観ポイント、あなたが経験を積んだら大丈夫です)。
@phgの回答は素晴らしいです。私はそれらを学んでいたとき、私は私のためにそれを明確にアップ助けた何かでチャイムます:
Maybe
は1(値)またはnoneである - つまり、あなたが値を持っているか、あなたは何もありませんEither
です論理的な分離にはなりますが、常に1つ以上の値があります。つまり、またはがありますが、両方はありません。
Maybe
は、値がある場合とない場合(たとえば、リスト内の項目を検索する場合など)に最適です。リストには、それが含まれている場合、我々はそうでない場合、我々はNothing
Either
は、あなたのコード内のブランチの完璧な表現であり得る(Maybe x)
を取得する - 一つの方法または他に行くために起こっています。 Left
またはRight
。私たちはそれを覚えてニーモニックを使用します:Right
はです。(正しい)です。 Left
はが間違っていますウェイ(エラー)です。これはそれが唯一の使用ではありませんが、間違いなく最も一般的です。
最初は微妙な違いがあるかもしれませんが、実際には非常に異なるものに適しています。
論理的論理和について言及するには、+ 1が得られます。これは、FPを初めて使う人にとっては、*非常に*近づける答えです。 –
Thanks Jared。あなたのフィードバックは私にはたくさんのことを意味します^ _ ^ – naomik
これは、すべての商品タイプをで2タプルとすべての非再帰的な合計タイプで表すことができるということで、これを極端に説明することができます。さらに再帰型を表現するには、固定小数点型が必要です。
たとえば、(a, (b, (c,d)))
または(((a,b), c), d)
と書くことができるときには、4タプル(a,b,c,d)
を使用するのはなぜですか?
また、次のような場合にもリストが表示されるのはなぜですか?
data Y f = Y (f (Y f))
type List a = Y ((,) (Either() a))
nil = Y (Left(), undefined)
cons a as = Y (Right a, as)
infixr 4 cons
numbers = 1 `cons` 2 `cons` 3 `cons` nil
-- this is like foldl
reduce f z (Y (Left(), _)) = z
reduce f z (Y (Right x, xs)) = reduce f (f z x) xs
total = reduce (+) 0 numbers
- 1. どのモナドが必要ですか?
- 2. モナド・トランスでリフティングが必要なのはいつですか?
- 3. トラバース可能なモナドの構成は常にモナドですか?
- 4. Scalasはなぜモナドではないのですか?
- 5. なぜサーバーレスパッケージにはcredが必要なのでしょうか?
- 6. 多分モナドが強制されるのはなぜですか?
- 7. Haskellモナドと文字列を必要としないフェイル
- 8. モナド対モナド変圧器
- 9. Rubyで私的なメソッドが必要なのはなぜでしょうか
- 10. 他のモナドの関数であるIOモナドでの使用
- 11. IOモナド内のモナドを使用する
- 12. モナド内部モナド変換器の結果
- 13. モナド変圧器モナドの複製
- 14. jQueryはモナドです
- 15. なぜData.Binary.Putモナドをラップするとメモリリークが発生するのですか?
- 16. 継続モナド内のIOモナドからの脱出
- 17. ハスケル:モナドのテイク?
- 18. モナドのフィールド。 Haskell
- 19. いくつかのモナド変圧器スタックを検討モナド変換
- 20. なぜボイラープレート新しいモナド変圧器を書き
- 21. トランススタックでSTTモナドをアンラッピングしますか?
- 22. Powershell Try、Catch:なぜ我々は最後に必要なのでしょうか?
- 23. ストリームとモナド
- 24. 状態モナド:別
- 25. 無料モナド - 猫
- 26. マッチングタイプとモナド。エラー
- 27. 選択モナドが応用モナドであることをCoq証明する
- 28. モナドの再パック - 一般的な方法?
- 29. ES制限トークンカウント - トークンフィルタなぜこれが必要でしょうか?
- 30. これはJavascriptで有効なモナド変換器ですか?
私は騙されていません。素晴らしい質問。 –