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

默认情况下haskell数据类型是共代数吗?

孙洋
2023-03-14

F-代数是用一个内函子描述的,内函子的函数是:F a->a,如果你把F a看作一个表达式,把a看作求这个表达式的结果,这是有意义的,正如链接的文章所解释的那样。

作为F-代数的对偶,F-余代数对应的函数为a->F a。维基百科说F-余代数可以用来创建无限的、懒惰的数据结构。a->F functon如何允许创建无限的、懒惰的数据结构?此外,考虑到这一点,由于Haskell是它的核心lazy,那么Haskell中的大多数数据类型是F-余代数而不是F-代数吗?F-代数不是懒惰求值的吗?

如果数据类型(或者至少是能够容纳无限数据的类型)是基于Haskell中的F-余代数的,那么对于列表来说,a->F a函数是什么?什么是列表的终端F-余代数?

list = 1 : map (+ 1) list

这在某种程度上使用F-余代数吗?无限数据结构在使用F-余代数的同时是否需要懒惰求值和递归的概念?我是不是漏掉了什么?

共有1个答案

陆寒
2023-03-14

余代数a->F可用于剥离(可能是无限的)数据结构的外层。对于X的列表,函子是f a=Maybe(X,a),与代数视图中的相同。在haskell中,余代数的函数是

headView :: [a] -> Maybe (a, [a])
headView [] = Nothing
headView (x:xs) = Just (x,xs)

unfoldr是对应于这个余代数的展开,就像foldr是对应于这个代数的折叠一样。

如果您认为[a]不是列表的类型,而是列表或程序的描述类型,那么这就允许您构造(看似)无限的值,只需要有限的描述。

 类似资料:
  • 为什么引用类型对象o无法访问变量a。它显示错误a无法解决或不是字段。

  • 默认情况下,我们的路由器是Yaf_Router, 而默认使用的路由协议是Yaf_Route_Static,是基于HTTP路由的, 它期望一个请求是HTTP请求并且请求对象是使用Yaf_Request_Http

  • 问题内容: 如果您定义如下界面 您可以在任何代码段中编写如下 那么equals方法从何而来,接口是否还扩展了超类Object?,如果确实如此,接口如何扩展类? 假设让该接口扩展超类Object,那么如果您看到为什么像Set这样的集合接口定义了equals()和hashCode()方法呢?所有类都扩展了Object类,因此,如果您在Object类中存在的接口中定义任何抽象方法,则实现该接口的人无需实

  • 在Haskell中有一个默认的单位类型,即()。我正在寻找一个多态的(最好是在Hackage中),例如: 或者可能是多态零型: 所以,是的,我可以自己写一个,通过上面的陈述。我想在hackage找一个。 我之所以需要它,是因为我有一个具有多个类型参数的类,其中包含一个不使用其中一个参数的函数: 使用此函数“someFunction”时,GHC找不到正确的实例,因此我更改了定义: 现在,当我调用某物

  • 问题内容: 第二个命令是否将当前路径添加为另一个搜索路径? 用冒号分隔多个路径是否正确? 默认情况下,当前路径不是始终在ClassPath中,因此不需要显式指定吗? 谢谢。 问题答案: 从Oracle的页面上设置类路径: 默认的类路径是当前目录。设置CLASSPATH变量或使用命令行选项将 覆盖 默认值,因此,如果要在搜索路径中包括当前目录,则必须包括“。”。在新设置中。 使用了Windows和类

  • 问题内容: 我有一个称为Product的类和一些扩展它的子类。现在在我的注释中,我有很多类型,例如: 然后定义我的Product类。我想做的是,如果Jackson无法检测到该字段不符合任何这些结构,则返回 未知产品 我该如何使用Jackson @Type注释呢?它应该像是在名称中插入空白或在我实际上不知道的值中添加一些标志(我尝试创建扩展Product的UnknownProduct,并且在名称值中