操作>>描述如下:
按顺序组成两个动作,丢弃由此产生的任何值 首先,像命令运算符(如分号)一样强制执行 语言。
以下是让我困惑的例子:
> ([1] ++ [2]) >> ([2] ++ [3])
[2,3,2,3]
我期待列表[2,3],这将是正确表达部分的结果。如何解释[2,3,2,3]的结果?
答案 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