列出 Monad
這些名單形成了一個單子。他們有一個 monad 例項,相當於這個:
instance Monad [] where
return x = [x]
xs >>= f = concat (map f xs)
我們可以使用它們來模擬計算中的非確定性。當我們使用 xs >>= f
時,函式 f::a -> [b]
被對映到列表 xs
上,獲得 f
的每個元素的每個應用的結果列表列表,然後將所有結果列表連線成所有結果的列表。例如,我們使用 do-notation 計算兩個非確定性數字的總和,總和由兩個列表中所有整數對的列表表示,每個列表表示非確定性數字的所有可能值:
sumnd xs ys = do
x <- xs
y <- ys
return (x + y)
或者等效地,在 Control.Monad
中使用 liftM2
:
sumnd = liftM2 (+)
我們獲得:
> sumnd [1,2,3] [0,10]
[1,11,2,12,3,13]