无法理解Monad的结果>>应用

时间:2016-07-25 16:45:24

标签: haskell monads

操作>>描述如下:

  

按顺序组成两个动作,丢弃由此产生的任何值   首先,像命令运算符(如分号)一样强制执行   语言。

以下是让我困惑的例子:

> ([1] ++ [2]) >> ([2] ++ [3])
[2,3,2,3]

我期待列表[2,3],这将是正确表达部分的结果。如何解释[2,3,2,3]的结果?

2 个答案:

答案 0 :(得分:12)

(>>)默认定义为

a >> b = a >>= (\_ -> b)

因此,忽略的值是给定monadic值a中的m a。专门列出的>>=类型为:

(>>=) :: [a] -> (a -> [b]) -> [b]

l >>= f为列表f的每个元素调用l以生成列表列表,然后将其连接起来。

e.g。

[1,2] >>= (\i -> [i, -i])
> [1,-1,2,-2]

忽略每个输入元素并返回值[2,3]将导致列表[2,3]的n份副本用于长度为n的输入列表

e.g。

[1] >>= (\_ -> [2,3])
> [2,3]

[1,2] >>= (\_ -> [2,3])
> [2,3,2,3]

第二个示例相当于您问题中的([1] ++ [2]) >> ([2] ++ [3])

答案 1 :(得分:7)

Lee对答案的一个小补充:

([1] ++ [2]) >> ([2] ++ [3])

相当于

([1] ++ [2]) >> ([2] ++ [3]) >>= \x -> return x

相当于

([1] ++ [2]) >>= \y -> ([2] ++ [3]) >>= \x -> return x

相当于

[ x | y <- [1]++[2] , x <- [2]++[3] ]

接近命令式伪代码

for y in [1]++[2]:
   for x in [2]++[3]:
      print x