朝風呂に入っていたら頭に浮かんだ、ものすごく素朴な疑問。
整数なり実数では普通に だけど、カルテシアン閉圏 (CCC) 一般に、任意の対象 で なのだろうか?普通にそうなりそうだし、集合の圏ならすぐ証明できそうだけど。
つか、普通の(型付)関数型言語でどうだろう?としばし考えてみる。基本は、 と で、かつ と がそれぞれ恒等射になるような , があればよい。*1
ということで、Haskellでそういう , を書いてみた。 はタプルで*2、はBool型で*3解釈している。
f :: (a, a) -> (Bool -> a) f (a1, a2) = \b -> case b of True -> a1 False -> a2 g :: (Bool -> a) -> (a, a) g h = (h True, h False)
QuickCheckしてみた。
prop_gf x y = (g.f) (x, y) == (x, y) where types = (x :: Int, y :: Int) prop_fg h x = (f.g) h x == h x where types = h :: Bool -> Int
*Main> quickCheck prop_gf OK, passed 100 tests. *Main> quickCheck prop_fg OK, passed 100 tests.
ちゃんとなってるっぽい。
考えてみると、(a, a)型 と (Bool -> a)型 は isomorphic ということか。ふーん。
…とここまで書いたところで、嫁さんに「何してんの」と聞かれたので説明したら「は? ? 当たり前じゃん」と鼻で笑われたスイマセン。