操作>>的结果描述如下:无法理解单子>>应用
顺序地构成两个动作,丢弃所生产的任何值的 第一个,如测序运营商(如分号)在当务之急 语言。
这里是一个让我困惑的例子:
> ([1] ++ [2]) >> ([2] ++ [3])
[2,3,2,3]
我期待的名单[2,3],它是表达的右侧部分的结果。如何解释[2,3,2,3]的结果?
操作>>的结果描述如下:无法理解单子>>应用
顺序地构成两个动作,丢弃所生产的任何值的 第一个,如测序运营商(如分号)在当务之急 语言。
这里是一个让我困惑的例子:
> ([1] ++ [2]) >> ([2] ++ [3])
[2,3,2,3]
我期待的名单[2,3],它是表达的右侧部分的结果。如何解释[2,3,2,3]的结果?
(>>)
是默认定义为
a >> b = a >>= (\_ -> b)
所以被忽略的值是在给定的一元值的m a
a
。的>>=
专用于列表中的类型是:
(>>=) :: [a] -> (a -> [b]) -> [b]
l >>= f
调用f
为列表l
的每个元素到产品清单,然后将其级联的列表。
例如
[1,2] >>= (\i -> [i, -i])
> [1,-1,2,-2]
忽略每个输入单元和返回值[2,3]
将导致列表[2,3]
的n个拷贝为长度n
例如的输入列表
[1] >>= (\_ -> [2,3])
> [2,3]
[1,2] >>= (\_ -> [2,3])
> [2,3,2,3]
这个第二个例子相当于([1] ++ [2]) >> ([2] ++ [3])
在你的问题。
一个小的补充,答案由李:
([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
'(>>)'丢弃_values_'1'和'2',但是这并不意味着'X >> Y === y' ... – Alec
用更简单的例子,我得到了我所期望的:[1] >> [2]结果 [2] – Scipio
尝试使用不同的类型来理解。例如。 '[1,2] >> ['a']' – pdexter