操作>>的結果描述如下:無法理解單子>>應用
順序地構成兩個動作,丟棄所生產的任何值的 第一個,如測序運營商(如分號)在當務之急 語言。
這裏是一個讓我困惑的例子:
> ([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