generated at
Listモナド
Haskellに出てくる普通のList型
非決定性を扱う
複数の結果を持つ計算
他の言語での配列に慣れていると、「非決定性」を意識しづらいmrsekut
同じものだが、そういう説明をされないので
do記法の糖衣構文であるリスト内包表記があるためあまりdo記法は書かない(?)

型注釈
:: [] Int とか :: [Int] みたいな型注釈

実装
hs
instance Monad [] where return x = [x] (>>=) = concatMap fail _ = []
>>= の定義をやや冗長に書くと以下のようになる
hs
xs >>= f = concat (map f xs)
map f xs で1階層深いリスト [[a], [a], [a]] を作って、
concat で結合してる [a,a,a]
f の型は a -> [b] であることに注意mrsekut
普段のmap時は a->b だけど、1階層深い


例: 整数のペアのリストから、合計が10になるペアを見つける
hs
import 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系関数




モナド則を満たしていない