2

文脈における価値についてちょっとした質問があります。

  • Take 、したがって、この場合Just 'a'のタイプのコンテキストでの値はMaybe'a'

  • を取るので、この場合[3]のタイプのコンテキストでの値は[a]3

  • [3]そして、次のようにモナドを適用すると、 value[3] >>= \x -> [x+3]を代入することになります。大丈夫です。x3

しかし、ここで を取り上げる[3,2]と、type のコンテキストでの値は何になります[a]か?. そして、モナドを次のように適用すると、とても奇妙です:

[3,4] >>= \x -> x+3  

正解は出ましたが、実はこの場合のx[6,7]が何なのかわかりません。答えることができます、ああ、xは 3 で、次に 4 であり、xは関数を 2 回フィードし、concatは次のように行います。Monadconcat (map f xs)

[3,4] >>= concat (map f x) 

したがって、この場合、x[3,4]に割り当てられます。は値ではないため、間違っていることを意味します。間違っている。[3,4]Monad

4

4 に答える 4

6

あなたの問題は価値観に集中しすぎていると思います。モナドは型構築子であり、値の数や種類には関係なく、コンテキストのみに関係します。

Aは である場合もMaybe aあれば、a何もない場合もあります。簡単です。あなたはそれを正しく観察しました。

AnEither String aは some a、または a の形式の情報String(たとえば、なぜ計算がa失敗したか) のいずれかです。

最後に[a]、不明な数のas (またはまったくない) です。これは、あいまいな計算、または複数の結果 (2 次方程式など) の結果である可能性があります。


ここで、 の解釈のため(>>=)に、モナドの本質的な性質 (圏論者による定義方法) を知っておくと役に立ちます。

join :: m (m a) -> m a.

とともにfmap(>>=)の観点から書くことができますjoin

joinつまり、次のことを意味します:同じコンテキストに再び配置されたコンテキストは、 (このモナドに対して) 同じ結果の動作を持ちます。

については、これは非常に明白ですMaybe (Maybe a)。本質的に何かがJust (Just x)、 またはNothing、 またはJust Nothingである可能性があり、 と同じ情報を提供しますNothing。したがって、を使用する代わりに、情報を失うことMaybe (Maybe a)Maybe aありません。つまりjoin、「より簡単な」コンテキストに変換されます。

[[a]]やや難しいですが、それほどではありません。基本的に、複数/あいまいな結果から複数/あいまいな結果が得られます。良い例は、二次方程式を解くことによって求められる 4 次多項式の根です。最初に 2 つの解が得られ、それぞれから別の 2 つの解を見つけることができ、結果として 4 つの根が得られます。

しかし要点は、あいまいなあいまいな結果について話すか、あいまいな結果について話すかは問題ではないということです。常に「あいまいな」コンテキストを使用し、複数のレベルをjoin.

そして(>>=)、リストの場合は次のようになります。あいまいな関数をあいまいな値に適用します。

squareRoots :: Complex -> [Complex] 

fourthRoots num = squareRoots num >>= squareRoots

として書き換えることができます

fourthRoots num = join $ squareRoots `fmap` (squareRoots num)
-- [1,-1,i,-i]    <-  [[1,-1],[i,-i]]  <-       [1,-1] <- 1

あなたがしなければならないのは、可能な値ごとに可能なすべての結果を見つけることだけだからです。

これが がリスト用である理由joinconcatあり、実際には

m >>= f == join (fmap f) m

どのモナドでも保持する必要があります。

についても同様の解釈ができますIO。副作用 ( IO (IO a)) を持つこともできる副作用のある計算は、本質的には副作用のあるものにすぎません

于 2012-11-23T17:19:23.390 に答える
3

「文脈」という言葉はかなり広く捉える必要があります。

値のリストを解釈する一般的な方法は、それが不確定な値を表すというものです。したがって、[3,4] は 3 または 4 の値を表しますが、どちらかはわかりません (おそらく、それが x^ の解であることを知っているだけです)。 2 - 7x + 12 = 0)。

これに f を適用すると、6 か 7 であることがわかりますが、どちらかはまだわかりません。

より慣れている不確定値の別の例は 3 です。これは、3::Int または 3::Integer、場合によっては 3.0::Double を意味する場合もあります。不確定な値を表すシンボルが 1 つしかないので簡単に感じますが、リストではすべての可能性がリストされます (!)。

あなたが書くなら

asum = do
   x <- [10,20]
   y <- [1,2]
   return (x+y)

4 つの可能な答えのリストが表示されます

于 2012-11-23T16:17:29.937 に答える
1

コンテキストにあるのは値ではなく、型です。

Just 'a' :: Maybe Char---CharMaybe文脈にあります。

[3, 2] :: [Int]---Int[]文脈にあります。

の が 1 つあるか、まったくないか、または多くあるかは問題ではありませam a

編集:のタイプを検討してください(>>=) :: Monad m => m a -> (a -> m b) -> m b

あなたは例を挙げJust 3 >>= (\x->Just(4+x))ます。しかし、考慮してNothing >>= (\x->Just(4+x))ください。コンテキストに値はありません。しかし、タイプはすべて同じコンテキストにあります。

x必ずしも単一の値であると考えるのは意味がありません。xシングルタイプがあります。Identityモナドを扱っているx場合、はい、単一の値になります。Maybeモナドにいる場合、単一の値である場合もあればx、まったく値ではない場合もあります。リストモナドにいるx場合、単一の値であるか、まったく値ではないか、さまざまな異なる値である可能性があります...しかし、そうでないのは、それらすべての異なる値のリストです。

あなたの他の例 --- [2, 3] >>= (\x -> x + 3)---[2, 3]は関数に渡されません。[2, 3] + 3型エラーになります。2関数に渡されます。そしてそうです3。関数は 2 回呼び出され、両方の入力の結果が得られ、その結果が>>=オペレーターによって結合されます。[2, 3]関数には渡されません。

于 2012-11-23T16:57:50.130 に答える
0

「コンテキスト」は、モナドについて考える私のお気に入りの方法の 1 つです。しかし、あなたは少し誤解しています。

ただ 'a' を取るので、タイプのコンテキストでの値は多分この場合は 'a' です

そうではありません。あなたは言い続けますthe value in contextが、常にコンテキストの「内部」に値があるとは限りません。または、ある場合でも、必ずしもそれが唯一の値であるとは限りません。それはすべて、話しているコンテキストによって異なります。

Maybeコンテキストは、「nullability」または潜在的な不在のコンテキストです。そこに何かがあるかもしれないし、あるかもしれないNothing。の「内部」に値はありませんNothing。したがって、多分コンテキストには値が含まれている場合と含まれていない場合があります。私があなたに を与えた場合、Maybe Fooあなたは があると仮定することはできませんFooむしろ、それは、実際にinsteadFoo が存在する可能性があるコンテキスト内にあるNothingと想定する必要があります。Maybe Fooタイプの何かはnullableFooであると言うかもしれません。

[3] を取るので、この場合のタイプ [a] のコンテキストの値は 3 です

繰り返しますが、まったく正しくありません。リストは、非決定論的なコンテキストを表します。「値」がどうあるべきか、または存在するかどうかはよくわかりません。のようなシングルトン リストの場合、[3]はい、1 つしかありません。しかし、リストについて考える1つの方法は、それが何であるかはよくわかりませんが、それ[3,4]またはそれ34. [Foo]何かの型は非決定論的Fooであると言うかもしれません。


[3,4] >>= \x -> x+3

これは型エラーです。これが何を意味するのかよくわかりません。

したがって、この場合[3,4]は x に割り当てられます。は値ではないため、間違っていることを意味[3,4]します。モナドは間違っています。

あなたはここで私を完全に失いました。の各インスタンスには、それが表すコンテキストを定義するMonad独自の実装があります。>>=リストの場合、定義は次のとおりです。

(xs >>= f) = (concat (map f xs))

の概念に関連するFunctorとの操作について学習すると、混乱を解消するのに役立つ場合があります。ApplicativeMonad

于 2012-11-23T22:45:31.807 に答える