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

为什么一个代数类型仅仅是一个初始代数(或者反之亦然)?

宗烨赫
2023-03-14

recursion-schemes包中,我们可以表示一个(严格正的)代数数据类型

    null
-- (1) define and declare the signature functor, here called Base

data instance Prim [a] x = Nil | Cons a x deriving Functor
type instance Base [a] = Prim [a]

-- (2) demonstrate the initial algebra
instance Foldable [a] where
  project []     = Nil
  project (a:as) = Cons a as

-- (3) demonstrate the final coalgebra
instance Unfoldable [a] where
  embed Nil         = []
  embed (Cons a as) = a:as

所以我的问题是:为什么foldableunfoldable作为单独的类?什么时候数据类型只能是其中一种还是另一种?

目前,我可以想象这对于抽象数据类型来说可能是有价值的,因为抽象数据类型只想提供折叠或展开接口,但是其他时候也是这样吗?

共有1个答案

胡和煦
2023-03-14

这可能不是您问题的答案,但严格正的Haskell数据类型是初始代数并不是真的。这样做的原因是,即使在Haskell的总子集(这是我们在推理时想要工作的!)你有无限的数据

例如,无限列表的折叠是部分的。

 类似资料:
  • 因此,我开始开发x86\u 64 hobby内核,我发现这段代码用于加载GDT(全局描述符表),但我不知道它是做什么的。 我知道它从rdi寄存器(sysv abi中函数调用的第一个参数的寄存器)加载我的gdt描述符,但我不知道为什么我需要将所有段寄存器设置为0x10,其余的是什么黑魔法?

  • 有没有自定义这个,这样我们就可以使用不同的功能?例如,Sum:

  • 我试图自学机器学习,我有一个类似的问题。 是否正确: 例如,如果我有一个输入矩阵,其中X1、X2和X3是三个数字特征(例如,假设它们是花瓣长度、茎长度、花长度,我试图标记样本是否是特定的花物种): 您将上表的第一个ROW(不是列)的向量输入到网络中,如下所示: 也就是说,将有三个神经元(第一个表行的每个值为1),然后随机选择w1、w2和w3,然后要计算下一列中的第一个神经元,您执行我描述的乘法,然

  • 我在Eclipse Mars中写了这行代码,以达到混乱的目的: 我收到以下编译器错误消息: 无法在原始类型null上调用toString() 这很奇怪,因为不是一个基元类型,也不是一个对象引用,如下所述:null是一个对象吗? 所以,为了确保万无一失,我尝试使用< code>javac编译这样奇怪的代码行,得到了这样的结果: 有人知道为什么Eclipse会给出这样(IMO)误导性的编译器错误消息吗

  • 我在SocketIO的帮助下创建了一个小的ReactJS仪表板,用于实时更新。即使我已经更新了仪表板,但我不太确定我是否做得正确,这让我很困扰。 最让我恼火的是getInitialState中作为反模式POST的道具。我创建了一个从服务器获取实时更新的仪表板,除了加载页面之外,不需要用户交互。根据我所读到的,应该包含决定是否重新呈现组件的内容,而...我还不知道。 但是,当最初调用时,只能传递道具