質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • JavaScript

    17468questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Scala

    191questions

    ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

  • Haskell

    63questions

    Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

  • 関数型プログラミング

    28questions

    関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

モナドについて

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 707

kostera

score 7

モナドについて教えてほしいことがあります。

以下のサイトが一番しっくりきました。
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

[本来の出力, おまけ] => 本来の出力

「エラーがあるかもしれない」を表すモナドであれば
ここがある意味エラーハンドリングになります。

この場合、"おまけ"はエラーのことで、
説明のため、
本来の出力の型がx、エラー情報の型をeとして、
E<x,e>と表すことにします

では、失敗するかもしれない処理f,gを考えます。
faをうけとり、E<b,e>を返すとします。
gbをうけとり、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'とすれば
めでたくfg'は「エラー処理」という文脈で繋げられます。

長々と書きましたが、質問文のリンク先は
複数の「普通の値」->「エラーがあるかもしれない値」という関数を
どうやって一つの「普通の値」->「エラーがあるかもしれない値」関数にまとめるかの話です。

参考:鉄道指向プログラミング(翻訳)


質問文のリンク先だと、モナドは副作用を扱うためのものと読めてしまいますが、

  • 「値がないことがある」 (Maybe, Option)
  • 「処理が失敗することがある」 (Either, Result)
  • 「値が複数ある」 (List)
  • 「副作用が起こる」 (IO)
  • 「状態がある」 (State)

などいろいろあります

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/15 10:34

    ご回答ありがとうございます。
    関数の結果をさらに次の関数の入力に使う時の為に「おまけ」を取る必要があるのですね。
    なんとなくイメージがつきました。
    JavaScriptでいうPromiseのthenとcatchが今回のモナドみたいな感じなんですね。
    理解が間違っているかもしれませんが、非常に助かりました。
    もう少し参考資料など見て理解を深めたいと思います。

    キャンセル

  • 2017/02/15 10:39

    Promiseもモナドらしいですからね。

    キャンセル

  • 2017/02/15 10:42

    なるほどそうなんですね。
    気付かない所でモナドの概念で作った実装を触ってたりするんですね。

    キャンセル

0

値 => [本来の出力, おまけ] 

おまけをつけるのは処理内でなので、
エラーハンドリングするとしたら、値のエラーチェックになるはず。

値が正しく、正常な処理が行われれば、常に正しいおまけが生成されるはず。
なので、異常なおまけを生み出す原因となる値をチェックして除外したり、エラーにすればよい。

[本来の出力, おまけ] => 本来の出力

本来の出力だけにすればよく、そのためにおまけを取り除けばよいので、取り除き方が問題なければ、そもそもエラーは考えなくてよいはず(値の変換時に正しいチェックが為されていれば、異常なおまけになることはない)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/15 10:39

    ご回答ありがとうございます。
    まだまだ理解できてない点があるのですが、ご回答内容でなんとなくイメージが付きました。
    (まだまだふんわりとしていますが。。)
    もっと勉強したいと思います。

    キャンセル

同じタグがついた質問を見る

  • JavaScript

    17468questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Scala

    191questions

    ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

  • Haskell

    63questions

    Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

  • 関数型プログラミング

    28questions

    関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。