generated at
Listモナドを圏論的観点から見る
Listモナドを圏論的観点から見る

Kleisli Tripleとの対応
対応
クライスリトリプルListモナド
TL
ηreturn
(-)^*concatMap
hs
type 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



Kleisli Tripleの満たすべき3条件のテスト
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]
テスト.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





参考