我试图确保我使用自然数的基本情况来理解初始代数和变态概念,但我肯定遗漏了一些东西(我的 Haskell 语法也可能一团糟)。
稍后编辑
我认为我的问题主要与定义和之间同构的函数Fx
/相关。我的理解是N (自然数的集合),即.unFix
NatF (Fix NatF)
Fix NatF
Fix NatF
Nat = Zero | Succ Nat
具体是如何Fx
定义的?这个对吗?
Fx ZeroF = Zero
Fx (SuccF ZeroF) = Succ (Fx ZeroF) = Succ (Zero)
如果是这样,为什么这与对[0, succ]评估的初始代数1 + N -> N不同?
原帖
我知道对于自然数,我们有函子F(U) = 1 + U和初始代数F(U) -> U其中unit变为0并且n变为succ(n) = n + 1。对于另一个由函数h求值的代数,catamorphism cata将是cata(n) = h n (unit)。
所以可以把函子写成data NatF a = ZeroF | SuccF a
,它的不动点为data Nat = Zero | Succ Nat
我想那我们可以定义Fx :: NatF (Fix NatF) -> Fix NatF
或说Fix NatF = Fx (NatF (Fix NatF))
如果我们用String
这样的载体类型定义另一个代数
h :: NatF String -> String
h ZeroF = "0"
h (SuccF x) = x ++ " + 1"
那么我认为我们可以使用cata h = h . fmap (cata h) . unFix
像 1 这样的自然数,如下所示
(h . fmap (cata h) . unFix) Fx(SuccF Fx(ZeroF)) =
(h . fmap (cata h)) (SuccF Fx(ZeroF)) =
h (SuccF (cata h)(Fx(ZeroF))) =
h(SuccF h(ZeroF)) =
h (SuccF "0") =
"0 + 1"
但这似乎不是公式cata(n) = h n (unit)。我在这一切中的错误在哪里?