2016-07-25 55 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