Listモナドを圏論的観点から見る
対応クライスリトリプル | Listモナド |
T | L |
η | return |
(-)^* | concatMap |
hstype L = []
eta :: a -> L a
eta a = [a]
ast :: (a -> L b) -> L a -> L b
ast f [] = [] -- ast = concatMap と同じ
ast f (x:xs) = f x ++ ast f xs
①f^*\circ\eta_A=f
②\eta_A^*=\mathrm{id}_{TA}
③g^*\circ f^*=(g^*\circ f)^*
準備.hs-- `f :: a -> L b` な関数の例を用意する
testFuncs =
[ \x -> [0,x,0]
, \x -> [0,x,x,0]
, \x -> [0,x,x,x,0]
]
testLists = [[],[1],[2,3],[4,5,6]]
test3cases = [ (g,f,d) | g <- testFuncs, f <- testFuncs, d <- testLists]
テスト.hstest1 = map (\f -> (ast f. eta) 10 == f 10) testFuncs
test2 = map (\xs -> ast eta xs == xs) testLists
test3 = map (\(g,f,d) -> (ast g . ast f) d == ast (ast g .f) d) test3cases
参考