当前位置: 首页 > 知识库问答 >
问题:

自然数的初始代数

公良扬
2023-03-14
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)=hn(单位)。

h :: NatF String -> String
h ZeroF  = "0"
h (SuccF x) = x ++ " + 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)=hn(单位)。在这一切中,我的错误在哪里?

共有1个答案

边明煦
2023-03-14

我想你的困惑与cata(n)=hn(单位)有关。这不是真的--您有一个Off by-One错误。特别是,考虑初始代数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)=h1(单位)。合适的通式为cata(n)=hn+1(单位)。

 类似资料:
  • 据我所知,来自Haskell的递归数据类型对应于类别[1,2]中的内函数的初始代数。例如: null

  • 问题内容: 我想像这样使用Self in init参数: 我知道我可以在这里使用“ A”,但是我想实现这一点,如果某个类从A继承,那么它的初始化器将知道操作是它的类类型,而不仅仅是A。所以例如,如果我这样写: 然后,我可以使用: 这可能吗? 问题答案: 不必使用或在每个初始化器中使用,您可以简单地重写每个子类的初始化器以使用其自己的类型为。 之所以起作用,是因为的初始值设定项声明的类型应符合,并且

  • 本文向大家介绍iOS 然后初始化,包括了iOS 然后初始化的使用技巧和注意事项,需要的朋友参考一下 示例 这在语法上类似于使用位置常量进行初始化的示例,但是需要Thenhttps://github.com/devxoul/Then的扩展名(如下所示)。 该Then扩展:            

  • 我已经用HTML和JS为自然对数的基数创建了一个算法。这是代码: html:bonl.html 但是,我在中输入了大约10千兆,得到的结果是1而不是2.71828...,尽管当我在中输入100万亿时,得到的结果是2.71828。 是我的计算机不能计算e,还是我的代码有错误,还是e=1?

  • 在包中,我们可以表示一个(严格正的)代数数据类型 null 所以我的问题是:为什么和作为单独的类?什么时候数据类型只能是其中一种还是另一种? 目前,我可以想象这对于抽象数据类型来说可能是有价值的,因为抽象数据类型只想提供折叠或展开接口,但是其他时候也是这样吗?

  • 本文向大家介绍Swift使用参数自定义初始化,包括了Swift使用参数自定义初始化的使用技巧和注意事项,需要的朋友参考一下 示例 请注意,您不能省略参数标签: 为了允许省略参数标签,请使用下划线_作为标签: 如果参数标签使用一个或多个属性共享名称,请使用self显式设置属性值: