2016-08-13 11 views
1

私は最近、あなたはHaskellを学び、私は表現に出くわし読んでいた:Haskellのモナドの実装

[1,2] >>= \n -> ['a', 'b'] >>= \ch -> return (n, ch) 

この式は結果

[(1,'a'),(1,'b'),(2,'a'),(2,'b')] 

を返しますので、私は、リストのモナドバインドがあることを理解します

xs >>= f = concatMap f xs 

式の前半をとります。

[1,2] >>= \n -> ['a', 'b'] 

それは私が、これはその後、関数にフィードバックされる理解したものから、['a','b','a','b']に評価:(\ch -> return (n , ch))

リストからの1,2の値がnにどのように割り当てられているのか、最後の関数でnに代入する方法をコンパイラがどのように記録しているのか分かりません。

+0

***材料を学んで明示的に括弧を省略すると、悪である***あまりにも厳しいですか。?これにより数え切れないほどの時間を無駄にする無数の初心者に尋ねる。 –

答えて

7

前半はあなたが何を考えていない、括弧はこのようなものです:

[1,2] >>= (\n -> ['a', 'b'] >>= (\ch -> return (n, ch))) 
+1

これは、ラムダ式が常に正しいほど遠くに移動するためです。 – dfeuer

関連する問題