Listモナド
Haskellに出てくる普通のList型
非決定性を扱う
複数の結果を持つ計算
他の言語での配列に慣れていると、「非決定性」を意識しづらいmrsekut.icon
同じものだが、そういう説明をされないので
do記法の糖衣構文であるリスト内包表記があるためあまりdo記法は書かない(?)
型注釈
:: [] Intとか:: [Int]みたいな型注釈
実装
code:hs
instance Monad [] where
(>>=) = concatMap
fail _ = []
>>=の定義をやや冗長に書くと以下のようになる
code:hs
xs >>= f = concat (map f xs)
map f xsで1階層深いリスト[[a], [a], [a]]を作って、
concatで結合してる[a,a,a]
fの型はa -> [b]であることに注意mrsekut.icon
普段のmap時はa->bだけど、1階層深い
例: 整数のペアのリストから、合計が10になるペアを見つける
code:hs
import Control.Monad (guard)
sumToTen pairs = do
(x, y) <- pairs
guard (x + y == 10)
return (x, y)
main :: IO ()
main = do
let resultPairs = sumToTen inputPairs
print resultPairs
リスト関係の関数
scan系関数