Scala的选项以什么方式折叠了一个变形?

时间:2014-05-18 16:27:51

标签: scala category-theory scala-option catamorphism recursion-schemes

this问题的答案表明,Scala中Option的折叠方法是一种catamoprhism。从维基百科中,catamophism是"从初始代数到其他代数的唯一同态。这个概念已经应用于函数式编程作为折叠"。这看起来很公平,但引导我initial algebra作为F-algebras类别中的初始对象。

因此,如果Option上的折叠真的是一个catamophism,那么需要有一些仿函数F来创建F代数的类别,其中Option将是初始对象。我无法弄清楚这个仿函数是什么。

对于A类型的列表,仿函数FF[X] = 1 + A * X。这是有道理的,因为List是递归数据类型,所以如果XList[A],那么上面会读到类型A的列表是空列表(1) ,或(+*A的一对(List[A])。但Option并不是递归的。 Option[A]只会是1 + A(Nothing或A)。所以我不知道仿函数在哪里。

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

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

1 个答案:

答案 0 :(得分:2)

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

初始代数的其他例子:

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

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

以同样的方式:

选项[X] = 1 + A表示选项=无|一些

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

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

我发现的一个很好的参考是Functional Generic Programming

无耻的插件:我在scala-reggen

中的代码中玩这些概念