2016-07-25 90 views
6

操作>>的结果描述如下:无法理解单子>>应用

顺序地构成两个动作,丢弃所生产的任何值的 第一个,如测序运营商(如分号)在当务之急 语言。

这里是一个让我困惑的例子:

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

我期待的名单[2,3],它是表达的右侧部分的结果。如何解释[2,3,2,3]的结果?

+2

'(>>)'丢弃_values_'1'和'2',但是这并不意味着'X >> Y === y' ... – Alec

+0

用更简单的例子,我得到了我所期望的:[1] >> [2]结果 [2] – Scipio

+2

尝试使用不同的类型来理解。例如。 '[1,2] >> ['a']' – pdexter

回答

12

(>>)是默认定义为

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

所以被忽略的值是在给定的一元值的m aa。的>>=专用于列表中的类型是:

(>>=) :: [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])在你的问题。

7

一个小的补充,答案由李:

([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