Maybeモナドを圏論的観点から見る
table:対応
クライスリトリプル Listモナド
T M
η eta
(-)^* ast
code:hs
type M = Maybe
eta :: a -> M a
eta = Just
ast :: (a -> M b) -> (M a -> M b)
ast f Nothing = Nothing
ast f (Just x) = f x
①$ f^*\circ\eta_A=f
②$ \eta_A^*=\mathrm{id}_{TA}
③$ g^*\circ f^*=(g^*\circ f)^*
code:準備.hs
f1,f2 :: Float -> M Float
f1 0 = Nothing
f1 x = Just (1/x)
f2 x = Just (x+1)
test3cases = [(g,f,ta) |
g <- testFuncs, f <- testFuncs,
ta <- testTAs]
code:テスト.hs
test1 = map (\(f,v) -> (ast f . eta) v == f v) test1cases
test2 = map (\ta -> ast eta ta == ta) testTAs
test3 = map (\(g,f,ta) ->
(ast g . ast f) ta ==
ast (ast g . f) ta)
test3cases
参考