4

Scala のMonads に関するJames Iry のブログ投稿を読んでいます。私はパート 3 にいて、Unit に関するモナドの第 2 法則に関する彼の説明について混乱しています。具体的には、この主張:

 unit(x) flatMap f = f(x)

ジェームズの以前のモナド型の例である私の精神的な例を適用すると、これはうまくいかないようです

 val x = 1
 val f = (_:Int) * 2
 f(x) == 2 //true
 List(x) flatMap f == 2 //fail
 Some(x) flatMap f == 2 //fail

実際のところ、型の問題のためにコンパイルさえしません。

明確にするために、これらが失敗する理由を理解しています。それらを修正してコンパイルする方法を理解しています。

私の混乱は、これらが記事で提示された理論と矛盾しているように見えるということです. 欠けているステップはありますか?これらの型は本当にモナドではないのですか? 「モナドの第 2 法則: 単位」というセクションは間違っていますか?

4

2 に答える 2

9

ScalaflatMapでは、 function のように単一の要素を返す関数ではなく、コレクションを返す関数が必要fです。

どちらかを使用map

List(x) map f

または、関数がコレクションを返すようにします。

val f = (x: Int) => List(x * 2)

List(x) flatMap f

単一の整数ではなく、コレクションも返すことに注意してください( だけList(2)でなくを取得します2)。

于 2012-06-08T13:02:40.217 に答える
8

型の問題のためにコンパイルできないという事実は、何かを教えてくれるはずです:fモナドの法則が適用される種類の関数ではありません!

flatMapは、コレクション操作ではなくモナド操作と見なされる場合、「モナド値」と、通常の値からモナド値への関数を取ります。あなたのf関数は、通常の値から通常の値への関数です。

fto を渡すことflatMapは、モナドの法則を破ることはありません。まったく意味がありません。不適切な表現です。同様に1 + "fork" - 1、次の算術法にも違反しません1 + x - 1 = x1 + "fork" - 1この法則から、実際にはコンパイラ エラーであるにもかかわらず、「フォーク」と等しいと結論付けることができます。しかし、それはばかげた結論になります。法律は、型が正しいことについてのみ話している。

于 2012-06-08T13:11:09.947 に答える