这个简单的链式绑定如何工作?

时间:2014-10-15 01:32:45

标签: haskell monads

我在Haskell学习Monads,我正在分析这个例子(http://learnyouahaskell.com/a-fistful-of-monads):

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

我想了解函数的这一部分发生了什么:

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

我的理解是\ch -> return (n,ch)\n -> ['a','b']作为参数组成,但我不确定这是怎么回事。我以为它有以下组成的功能:

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

但这似乎没有输出与完整表达式相同的结果。

编辑1:

考虑到完整括号内的答案是:

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

这使我获得了这个组合功能:

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

1 个答案:

答案 0 :(得分:3)

实际上有点不同。括号如下

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

或者,如果您愿意

let step1 n = 
  let step2 ch = return (n, ch)
  in ['a','b'] >>= step2
in [1,2] >>= step1