this问题的答案表明,Scala中Option的折叠方法是一种catamoprhism。从维基百科中,catamophism是"从初始代数到其他代数的唯一同态。这个概念已经应用于函数式编程作为折叠"。这看起来很公平,但引导我initial algebra作为F-algebras类别中的初始对象。
因此,如果Option上的折叠真的是一个catamophism,那么需要有一些仿函数F来创建F代数的类别,其中Option将是初始对象。我无法弄清楚这个仿函数是什么。
对于A
类型的列表,仿函数F
为F[X] = 1 + A * X
。这是有道理的,因为List是递归数据类型,所以如果X
是List[A]
,那么上面会读到类型A
的列表是空列表(1
) ,或(+
)*
和A
的一对(List[A]
)。但Option并不是递归的。 Option[A]
只会是1 + A
(Nothing或A
)。所以我不知道仿函数在哪里。
为了清楚起见,我意识到Option已经是一个仿函数,因为它需要A
到Option[A]
,但对列表所做的是不同的,A
是固定的,仿函数用于描述如何递归构造数据类型。
在相关的说明中,如果它不是一个变形,它可能不应被称为折叠,因为这会导致一些confusion。
答案 0 :(得分:2)
嗯,评论是在正确的轨道上。我只是一个初学者,所以我可能有一些误解。是的,重点是能够对递归类型进行建模,但我认为没有什么可以排除非递归的类型。 F-代数。由于最初的代数是“最不固定的点”"等式X~ = F X的解。在Option的情况下,解决方案是微不足道的,因为不涉及递归:)
初始代数的其他例子:
List [X] = 1 + A * X表示list = Nil |列表
树[X] = A + A * X * X表示树=叶a |节点树树
以同样的方式:
选项[X] = 1 + A表示选项=无|一些
存在"常数的理由"仿函数很简单,你如何表示一个树的节点? 事实上,对于代数模型(简单)递归数据类型,您只需要以下仿函数:
我发现的一个很好的参考是Functional Generic Programming
无耻的插件:我在scala-reggen
中的代码中玩这些概念