Maybeモナドを圏論的観点から見る
対応クライスリトリプル | Listモナド |
T | M |
η | eta |
(-)^* | ast |
hstype 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)^*
準備.hsf1,f2 :: Float -> M Float
f1 0 = Nothing
f1 x = Just (1/x)
f2 x = Just (x+1)
testFuncs = [f1,f2]
testFloats = [10,100,0.1] :: [Float]
testTAs = [Nothing, Just 0, Just 1]
test1cases = [(f, v) | f <- testFuncs, v <- testFloats]
test3cases = [(g,f,ta) |
g <- testFuncs, f <- testFuncs,
ta <- testTAs]
テスト.hstest1 = 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
参考