7

这个问题的答案表明,Scala 中 Option 上的 fold 方法是一种变态。来自维基百科的catamophism是“从初始代数到其他代数的独特同态。这个概念已被应用于函数式编程作为折叠”。所以这看起来很公平,但让我把初始代数作为F-algebras类别中的初始对象。

因此,如果 Option 上的折叠真的是一个变态,则需要一些函子 F,以创建 F 代数的类别,其中 Option 将是初始对象。我不知道这个函子会是什么。

对于 Lists 类型A的函子FF[X] = 1 + A * X. 这是有道理的,因为 List 是一种递归数据类型,所以如果X是,List[A]那么上面的内容读取类型列表A要么是空列表 ( 1),要么是 ( ) an和 a+的对 ( ) 。但 Option 不是递归的。将只是(无或)。所以我看不到函子在哪里。*AList[A]Option[A]1 + AA

为了清楚起见,我意识到 Option 已经是一个仿函数,因为它需要Ato Option[A],但是对列表所做的事情是不同的,它A是固定的,并且仿函数用于描述如何递归地构造数据类型。

在相关的说明中,如果它不是变质,它可能不应该被称为折叠,因为这会导致一些混乱

4

1 回答 1

2

好吧,评论在正确的轨道上。我只是一个初学者,所以我可能有一些误解。是的,重点是能够对递归类型进行建模,但我认为没有什么可以排除“非递归”F-代数。由于初始代数是方程 X ~= F X 的“最小不动点”解。在 Option 的情况下,解是微不足道的,因为不涉及递归 :)

初始代数的其他示例:

List[X] = 1 + A * X 表示列表 = Nil | 缺点列表

Tree[X] = A + A * X * X 表示树 = 叶 a | 节点一棵树树

以同样的方式:

Option[X] = 1 + A 表示 option = None | 一些

“常数”函子存在的理由很简单,你如何表示树的节点?事实上,要对(简单)递归数据类型进行代数建模,您只需要以下仿函数:

  • U(单位,代表空)
  • K(常数,捕获一个值)
  • I(身份,代表递归位置)
  • * (产品)
  • +(副产品)

我发现的一个很好的参考是函数泛型编程

无耻的插件:我在scala-reggen的代码中使用这些概念

于 2014-07-08T06:57:21.073 回答