Scala的Option类型中,fold函数是一个范畴论中的折叠函数吗?

7
这个问题的答案表明,在Scala中,Option的fold方法是一个catamorphism。从维基百科上可以看到,catamorphism是“从初始代数到其他代数的唯一同态。该概念已应用于函数式编程中的折叠”。所以这似乎是合理的,但我需要了解F-代数类别中的初始代数作为初始对象。
因此,如果Option上的fold确实是一个catamorphism,就需要有某个函子F来创建F-代数类别,其中Option将是初始对象。我无法确定这个函子是什么。
对于类型为A的列表,函子FF[X] = 1 + A * X。这是有道理的,因为列表是一种递归数据类型,所以如果XList[A],那么上面的内容表示类型为A的列表要么是空列表(1),要么是一个A和一个List[A]的对组(*)。但是选项不是递归的。Option[A]只是1 + A(Nothing或A)。所以我不知道函子在哪里。
只是为了明确,我意识到Option已经是一个函子,它将A变成Option[A],但是对于列表所做的事情是不同的,A是固定的,并且使用函子来描述如何递归构造数据类型。

顺带一提,如果不是一个 catamorphism,它可能不应该被称为 fold,因为这会导致一些 混淆


你认为 F 必须是递归的基础是什么?许多代数数据类型并不是递归的。无论如何,你总可以“作弊”,写出类似 F[X] = 1 + Const A X 的东西。 - Travis Brown
F[X] = 1 + Const A XF[X] = 1 + A 所表示的函子相同吗?(将每个类型映射到 Option[A] 的函子。)我认为这是成立的,但这么简单以至于我认为应该会有更多内容。在此 F 下,任何 F-代数都只是具有从 Option[A] 到 B 的映射的类型 B。那么初始性质就是说,给定一个类型 B 和从 Option[A] 到 B 的映射,存在一个唯一的从 Option[A] 到 B 的映射。http://homepages.inf.ed.ac.uk/wadler/papers/free-rectypes/free-rectypes.txt(链接自维基百科)还暗示了初始 F-代数的目的是对于递归数据类型。 - Patrick
2
此外,如果您允许常量函子,则对于任何类型T,您可以考虑函子F [X] = T。然后,F-代数就是一个类型B和从TB的映射gT立即成为初始代数,而catamoprhism只是将g应用于类型T的对象。这似乎就是发生的事情,因为Option [A]是ANothing的余积,从Option [A]B的映射分裂为从AB的映射和从NothingB的映射,这符合Option上的fold的类型签名。 - Patrick
1个回答

2
好的,评论的方向是正确的。我只是一个初学者,所以可能有一些误解。是的,整个重点是能够建模递归类型,但我认为没有什么可以阻止“非递归”的F-代数存在。因为初始代数是方程X ~= F X的“最小不动点”解。对于Option而言,解决方案是微不足道的,因为没有涉及到递归:)

其他初始代数的例子:

List[X] = 1 + A * X,用于表示列表= Nil | Cons a list

Tree[X] = A + A * X * X,用于表示树= Leaf a | Node a tree tree

同样地:

Option[X] = 1 + A,用于表示选项= None | Some a

存在“常量”函子的理由相当简单,如何表示树的节点? 事实上,为了代数地建模(简单的)递归数据类型,您只需要以下函子:

  • U(单位,表示空)
  • K(常量,捕获值)
  • I(身份,表示递归位置)
  • *(积)
  • +(余积)
我找到了一个不错的参考资料Functional Generic Programming
无耻地自推一下:我正在scala-reggen中用代码实现这些概念。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接