2006-05-22 [長年日記]
λ. 順序数をプログラミング言語の中で実現する
以前に順序数の概念を理解するために書いたコードがあるので、そのときのコードを晒してみます。といっても、当たり前のことを当たり前に書いただけのコードですが。
-- ストリーム
data Stream a = Stream a (Stream a)
instance Functor Stream where
fmap f (Stream h t) = Stream (f h) (fmap f t)
unfold :: (s -> (a,s)) -> (s -> Stream a)
unfold phi = h
where h s = case phi s of
(a,t) -> Stream a (h t)
-- 順序数
data Ordinal
= OZero
| OSucc Ordinal
| OSup (Stream Ordinal)
add :: Ordinal -> Ordinal -> Ordinal
add a OZero = a
add a (OSucc b) = OSucc (add a b)
add a (OSup b) = OSup (fmap (add a) b)
mul :: Ordinal -> Ordinal -> Ordinal
mul a OZero = OZero
mul a (OSucc b) = add (mul a b) a
mul a (OSup b) = OSup (fmap (mul a) b)
pow :: Ordinal -> Ordinal -> Ordinal
pow a OZero = OSucc OZero
pow a (OSucc b) = mul (pow a b) a
pow a (OSup b) = OSup (fmap (pow a) b)
omega :: Ordinal
omega = OSup (unfold (\a -> (a, OSucc a)) OZero)
- OSupの引数のストリームには何らかの正規化のようなことを行うべきだろうか?
- 増大列でない列を排除するのは依存型を使うのが自然だろうけど、GADT等を使ってHaskellで無理やりやる方法はないだろうか?
[ツッコミを入れる]
