问题描述
我试图确保我使用自然数的基本情况理解初始的代数和同构概念,但我肯定缺少某些东西(而且我的Haskell语法可能很烂)。
稍后进行编辑
我认为我的问题主要与定义Fx
和unFix
之间同构的函数NatF (Fix NatF)
/ Fix NatF
有关。我的理解是Fix NatF
是 N (自然数集),即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 ,其中单位转到 0 , n 转到 succ(n)= n + 1 。对于另一个用函数 h 求值的代数,其同构关系 cata 将是 cata(n)= h n (单位)。
因此可以将函子写为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 (单位)。这一切我的错误在哪里?
解决方法
代数A
由(同构)构成
- 类型
z :: A
- 一个常量
s :: A -> A
(您称为“单位”) - 函数
cata algebra n = s^n(z)
(您将其称为“ h”)
然后非正式地h
。
在您的示例中,h :: NatF String -> String
h ZeroF = "0"
h (SuccF x) = x ++ " + 1"
是
z
但这是整个代数(s
和s
),而不仅是h
态射。
您上面的A = String
与此对应:
-
z = "0"
-
s x = x ++ " + 1"
-
cata h 1 = s^1(z) = s z = "0" ++ " + 1" = "0 + 1"
事实上,(用非正式符号)h
。
结论:不要同时使用s
和代数data class Player(
@SerializedName("Position")
val position: String,@SerializedName("Name_Full")
val name: String
...)
来称呼“代数”。
我认为您的困惑与 cata(n)= h n (单元)有关。这是不正确的-您有一个错误的错误。特别要考虑初始代数nat :: 1 + Nat -> Nat
的定义交换图:
nat
1 + Nat ---> Nat
| |
| F(cata) | cata
V V
h
1 + A ---> A
这提供了以下内容,并为参数提供了类似Haskell的“类型注释”,以使我们正在做的事情更加清楚:
cata(0 :: Nat)
-- by definition of nat(unit)
= cata(nat(unit :: 1 + Nat) :: Nat)
-- by diagram
= h(F(cata)(unit :: 1 + Nat) :: 1 + A)
-- as F(cata)(unit) = unit
= h(unit :: 1 + A)
因此,您实际上具有 cata(0)= h 1 (单位)。适当的通用公式为 cata(n)= h n + 1 (单位)。