列出 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]