Listモナド
Haskellに出てくる普通のList型
非決定性を扱う
複数の結果を持つ計算
他の言語での配列に慣れていると、「非決定性」を意識しづらい

同じものだが、そういう説明をされないので
do記法の糖衣構文であるリスト内包表記があるためあまりdo記法は書かない(?)
型注釈
:: [] Int
とか :: [Int]
みたいな型注釈
実装
hsinstance Monad [] where
return x = [x]
(>>=) = concatMap
fail _ = []
>>=
の定義をやや冗長に書くと以下のようになる
hsxs >>= f = concat (map f xs)
map f xs
で1階層深いリスト [[a], [a], [a]]
を作って、
concat
で結合してる [a,a,a]
f
の型は
a -> [b]
であることに注意

普段のmap時は a->b
だけど、1階層深い
例: 整数のペアのリストから、合計が10になるペアを見つける
hsimport Control.Monad (guard)
sumToTen :: [(Int, Int)] -> [(Int, Int)]
sumToTen pairs = do
(x, y) <- pairs
guard (x + y == 10)
return (x, y)
main :: IO ()
main = do
let inputPairs = [(3, 7), (4, 6), (5, 5), (2, 8), (1, 9)]
let resultPairs = sumToTen inputPairs
print resultPairs
リスト関係の関数
scan系関数