[解決済み】なぜモナドが必要なのか?
質問
私の考えでは、有名な質問に対する答えは モナドとは何ですか? 特に、最も多く投票されたものは、モナドとは何かを明確に説明することなく、モナドを説明しようとしています。 モナドが本当に必要な理由 . 問題解決として説明できるのか?
どのように解決するのか?
なぜモナドが必要なのか?
- プログラミングをしたい 関数だけを使う . ("関数型プログラミング(FP)"結局のところ)。
-
では、最初の大問題です。これはプログラムです。
f(x) = 2 * x
g(x,y) = x / y
どうすれば 何が最初に実行されるか ? 関数の順序を決めるにはどうしたらよいのでしょうか? プログラム ) 関数しか使わない ?
解決策 関数の合成 . もし、最初に
g
で、次にf
と書くだけです。f(g(x,y))
. このように、quot;the program" は関数でもあります。main = f(g(x,y))
. OK、でも... -
その他の問題:いくつかの機能 に失敗する可能性があります。 (例
g(2,0)
, 0で割る)。私たちは 例外はありません。 をFPで表現することができます(例外は関数ではありません)。どのように解決するのでしょうか?解決方法 では 関数が2種類のものを返せるようにする の代わりに
g : Real,Real -> Real
(二つの実数から一つの実数への関数)を、次のようにしましょう。g : Real,Real -> Real | Nothing
(2つの実数から(実数または何もない)への関数)。 -
しかし、関数は(よりシンプルにするために)以下のものしか返さないはずです。 一つのこと .
解決策:返すデータの種類を新しく作ってみよう、" ボックス型 実体を包むか、あるいは単に無である。したがって、私たちは、次のようにすることができます。
g : Real,Real -> Maybe Real
. よし、でも. -
にはどうなるのでしょうか?
f(g(x,y))
?f
を消費する準備ができていない。Maybe Real
. で接続できるすべての関数を変更することは避けたい。g
を消費するようにMaybe Real
.解決策:Let's 関数の接続/合成/リンクのための特別な関数があります。 . そうすれば、裏側で、ある関数の出力を次の関数の出力に適応させることができます。
私たちの場合
g >>= f
(接続/合成g
からf
). 私たちは>>=
を取得するg
の出力を検査し、万が一それがNothing
を呼び出さないだけです。f
を返しNothing
または、逆に、ボックス化されたReal
を送りf
を付けています。(このアルゴリズムは、単に>>=
に対してMaybe
タイプ)を使用します。また、以下の点に注意してください。>>=
は、次のように書かなければなりません。 一度だけ ボクシングタイプごとに(異なるボックス、異なる適応アルゴリズム)。 -
1.異なる意味や値をコード化・保存するために"box"を使用し、以下のような機能を持たせる。
g
これらの"boxed values"を返すようにする。2. コンポーザー/リンカーを持つg >>= f
の接続を支援するためにg
の出力とf
の入力を変更する必要はありません。f
を使用します。 -
この手法で解決できる顕著な問題点としては
-
一連の関数(プログラム)の中のすべての関数が共有できるグローバルな状態を持つこと:解決策
StateMonad
. -
私たちは、「不純な関数」を好みません。 異なる に対する出力は 同じ を入力します。そこで、これらの関数をマークして、タグ付け/ボックス化された値を返すようにしましょう。
IO
モナドを使用します。
-
トータルハピネス!
関連
-
[解決済み] HaskellでIntからsqrtを取得する
-
[解決済み] Haskell takeWhile + 1
-
[解決済み] Project Eulerとの速度比較。CとPythonとErlangとHaskellの比較
-
[解決済み] フリーモナドとは何ですか?
-
[解決済み】代数的なデータ型の代数を悪用する - なぜこれが有効なのか?
-
[解決済み】Template Haskellの何がそんなに悪いのか?
-
[解決済み】Haskell: リスト、配列、ベクトル、シーケンス
-
[解決済み】一般的なHaskellの演算子で発音可能な名前はありますか?[クローズド]
-
[解決済み】なぜモナドが必要なのか?
-
[解決済み】Haskell/GHCの`forall`キーワードは何をするのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] haskellでCharからIntに変換する
-
[解決済み] Haskellの[]と':'とは何ですか?
-
[解決済み] Haskellにおける除算
-
[解決済み】Weak Head Normal Formとは何ですか?
-
[解決済み】Haskell: リスト、配列、ベクトル、シーケンス
-
[解決済み】Not a Functor/Functor/Applicative/Monadの良い例?
-
[解決済み】一般的なHaskellの演算子で発音可能な名前はありますか?[クローズド]
-
[解決済み】なぜモナドが必要なのか?
-
[解決済み】Haskell の `data` と `newtype` の違いについて
-
[解決済み】Haskellの入門編