モナドについて教えてほしいことがあります。
以下のサイトが一番しっくりきました。
https://www.google.co.jp/amp/s/ubiteku.oinker.me/2016/01/20/%25E9%2596%25A2%25E6%2595%25B0%25E5%259E%258B%25E3%2581%25A4%25E3%2581%25BE%25E3%2581%25BF%25E9%25A3%259F%25E3%2581%2584-%25E3%2583%25A2%25E3%2583%258A%25E3%2583%2589%25E3%2581%258C%25E9%259B%25A3%25E3%2581%2597%25E3%2581%2584%25E3%2581%25A8%25E6%2580%259D%25E3%2582%258F%25E3%2582%258C%25E3%2581%25A6%25E3%2581%2584%25E3%2582%258B/amp/
簡単にまとめると
関数型プログラミングでは、関数に副作用を持たせてはならない。
常に同じ入力には同じ出力を返す。
ただ、処理中にエラーが発生したりするので常に同じ出力は難しい。
なので以下の様な概念で関数を作る。
※おまけは副作用の情報
本来の出力をおまけ付きに変換してくれる仕組み: 出力値 => [本来の出力, おまけ]
おまけ付きの値を、そのままおまけ無しの値として関数に渡せる仕組み: [本来の出力, おまけ] => 本来の出力
すごく分かりやすかったんですが、この説明だとおまけを最終的に意識してないように思います。
おまけを見てエラー処理などもしないといけないと思うのですが、モナドではエラー処理をしないのでしょうか?
(そんなことないと思うのですが、分かる方いましたら教えて下さい。)
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
[本来の出力, おまけ] => 本来の出力
「エラーがあるかもしれない」を表すモナドであれば
ここがある意味エラーハンドリングになります。
この場合、"おまけ"はエラーのことで、
説明のため、
本来の出力の型がx
、エラー情報の型をe
として、
E<x,e>
と表すことにします
では、失敗するかもしれない処理f
,g
を考えます。
f
はa
をうけとり、E<b,e>
を返すとします。
g
はb
をうけとり、E<c,e>
を返すとします。
f : a -> E<b,e>
g : b -> E<c,e>
処理f
,g
を連続で適用するにはどうしたら良いでしょう?
それには、
f
の結果E<b,e>
をg
の入力の型b
に「うまく渡す」仕組みが必要になります。
("[本来の出力, おまけ] => 本来の出力" はこれのことを言っている)
この、「うまく渡す」は具体的にどうするかですが、
例えば、「f
でエラーがあったらg
を飛ばす」というように作ります。
ここで、「入力がエラーだったら何もせずエラーを返す、正常ならg
を適用して返す」関数をg'
とすれば
めでたくf
とg'
は「エラー処理」という文脈で繋げられます。
長々と書きましたが、質問文のリンク先は
複数の「普通の値」->「エラーがあるかもしれない値」という関数を
どうやって一つの「普通の値」->「エラーがあるかもしれない値」関数にまとめるかの話です。
質問文のリンク先だと、モナドは副作用を扱うためのものと読めてしまいますが、
- 「値がないことがある」 (Maybe, Option)
- 「処理が失敗することがある」 (Either, Result)
- 「値が複数ある」 (List)
- 「副作用が起こる」 (IO)
- 「状態がある」 (State)
などいろいろあります
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
値 => [本来の出力, おまけ]
おまけをつけるのは処理内でなので、
エラーハンドリングするとしたら、値のエラーチェックになるはず。
値が正しく、正常な処理が行われれば、常に正しいおまけが生成されるはず。
なので、異常なおまけを生み出す原因となる値をチェックして除外したり、エラーにすればよい。
[本来の出力, おまけ] => 本来の出力
本来の出力だけにすればよく、そのためにおまけを取り除けばよいので、取り除き方が問題なければ、そもそもエラーは考えなくてよいはず(値の変換時に正しいチェックが為されていれば、異常なおまけになることはない)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/02/15 10:34
関数の結果をさらに次の関数の入力に使う時の為に「おまけ」を取る必要があるのですね。
なんとなくイメージがつきました。
JavaScriptでいうPromiseのthenとcatchが今回のモナドみたいな感じなんですね。
理解が間違っているかもしれませんが、非常に助かりました。
もう少し参考資料など見て理解を深めたいと思います。
2017/02/15 10:39
2017/02/15 10:42
気付かない所でモナドの概念で作った実装を触ってたりするんですね。