2015-12-12 11 views
15

私は詳述するとGHCiのトラブル[ジャスト、ジャスト]

:t sequence [Just,Just] 
sequence [Just, Just] :: a -> [Maybe a] 

にこれを得たシーケンス

の種類を見たときので、私は sequence [Just 1, Just 2] :: Num a => Maybe [a]を理解することができます理由として混乱しています
sequence :: (Monad m, Traversable t) => t (m a) -> m (t a) 

この関数はモナド値のコレクションを取り、コレクションの単一のモナド値を返すことは明らかです。したがって、sequence [Just 1, Just 2]と呼び出すと、Just[1,2]に戻ってしまうはずです。思考の列車に続いて、 Justを返すべきではない?

ありがとうございました。

答えて

22

第2のsequenceは、別のモナドで動作します。

sequence [Just 1, Just 2] 

我々はJust 1 :: Maybe aと、これはMaybeモナドの値であることがあります:最初の場合

。具体的には、タイプ[Maybe a]は、配列によって要求されるようにt (m b)と一致し、t ~ [],m ~ Maybe,b ~ a - Maybeモナドを得る。第二のために

sequence [Just, Just] 

我々はJust :: a -> Maybe aことがあります。どのモナドがこれですか?現在[a -> Maybe a]のタイプはt (m b)と一致しており、t ~ [],m ~ (->) a,b ~ Maybe aとなっており、現在は(->) aのモナドで働いており、現在はではありません。

モナドと同形であるこの(->) aモナドでは、

sequence [f, g, h] = \x -> [f x, g x, h x] 

実際、(->) aモナドでの計算は、「タイプaの暗黙の引数を読み込む」の計算です。 sequence関数は、そのような計算([(->) a b]、すなわち[a -> b])のリストを暗黙の引数を1回だけ読み取る単一の計算に変換し、すべての結果が (a -> [b])のリストを生成します。

+0

nice!ありがとうございました! –

関連する問題