Listモナドを圏論的観点から見る
table:対応
クライスリトリプル Listモナド
T L
η return
(-)^* concatMap
code:hs
type L = []
eta :: a -> L 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)^*
code:準備.hs
-- f :: a -> L b な関数の例を用意する
testFuncs =
]
testLists = ],1,2,3,[4,5,6 code:テスト.hs
test1 = 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
参考