Listモナド
Haskellに出てくる普通のList型
非決定性を扱う
複数の結果を持つ計算
他の言語での配列に慣れていると、「非決定性」を意識しづらいmrsekut.icon
同じものだが、そういう説明をされないので
do記法の糖衣構文であるリスト内包表記があるためあまりdo記法は書かない(?)
型注釈
:: [] Intとか:: [Int]みたいな型注釈
実装
code:hs
instance Monad [] where
return x = x
(>>=) = 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 :: (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
リスト内包表記 (hs)
リスト関係の関数
http://walk.northcol.org/haskell/lists/
https://qiita.com/7ma7X/items/8cee82377587058ff0c3
scan系関数
https://blog.miz-ar.info/2019/10/scanl-and-scanr/
Heterogenous collections
ListT型クラス
https://viercc.github.io/blog/posts/2020-02-29-commutative-monad.html
モナド則を満たしていない