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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Scala

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

Haskell

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

JavaScript

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

関数型プログラミング

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

Q&A

解決済

2回答

1916閲覧

モナドについて

kostera

総合スコア13

Scala

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

Haskell

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

JavaScript

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

関数型プログラミング

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

0グッド

2クリップ

投稿2017/02/14 16:02

編集2017/02/14 16:10

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

以下のサイトが一番しっくりきました。
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/

簡単にまとめると


関数型プログラミングでは、関数に副作用を持たせてはならない。
常に同じ入力には同じ出力を返す。
ただ、処理中にエラーが発生したりするので常に同じ出力は難しい。

なので以下の様な概念で関数を作る。
※おまけは副作用の情報

本来の出力をおまけ付きに変換してくれる仕組み: 出力値 => [本来の出力, おまけ]
おまけ付きの値を、そのままおまけ無しの値として関数に渡せる仕組み: [本来の出力, おまけ] => 本来の出力


すごく分かりやすかったんですが、この説明だとおまけを最終的に意識してないように思います。
おまけを見てエラー処理などもしないといけないと思うのですが、モナドではエラー処理をしないのでしょうか?
(そんなことないと思うのですが、分かる方いましたら教えて下さい。)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

この場合、"おまけ"はエラーのことで、
説明のため、
本来の出力の型が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 00:14

編集2017/02/15 00:47
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kostera

2017/02/15 01:34

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

2017/02/15 01:39

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

2017/02/15 01:42

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

0

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

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

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

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

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

投稿2017/02/14 21:44

yamato_hikawa

総合スコア2092

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kostera

2017/02/15 01:39

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問