【发布时间】:2014-07-06 14:45:30
【问题描述】:
this 问题的答案表明,Scala 中 Option 上的 fold 方法是一种变态。来自维基百科的catamophism 是“从初始代数到其他代数的独特同态。这个概念已被应用于函数式编程作为折叠”。所以这看起来很公平,但将我引向initial algebra 作为F-algebras 类别中的初始对象。
因此,如果 Option 上的折叠确实是一个变态,则需要一些函子 F,以创建 F 代数的类别,其中 Option 将是初始对象。我不知道这个函子会是什么。
对于A 类型的列表,函子F 是F[X] = 1 + A * X。这是有道理的,因为 List 是一种递归数据类型,所以如果 X 是 List[A],那么上面读取的类型为 A 的列表要么是空列表 (1),要么是 (+) A 和 List[A] 的对 (*)。但是 Option 不是递归的。 Option[A] 将只是 1 + A(什么都没有或 A)。所以我看不到函子在哪里。
为了清楚起见,我意识到 Option 已经是一个函子,因为它需要 A 到 Option[A],但是对列表所做的事情是不同的,A 是固定的,函子用于描述如何递归构造数据类型。
在相关的说明中,如果它不是变质,它可能不应该被称为折叠,因为这会导致一些confusion。
【问题讨论】:
-
您认为
F必须 是递归的依据是什么?许多代数数据类型不是。在任何情况下,你总是可以“作弊”并写出类似F[X] = 1 + Const A X的东西。 -
F[X] = 1 + Const A X和F[X] = 1 + A的函子一样吗? (将每种类型发送到 Option[A] 的函子。)我想这可行,但它是如此微不足道,以至于我认为还会发生更多事情。在这个 F 下,任何 F 代数都只是一个类型 B,具有从 Option[A] 到 B 的映射。然后初始性只是说给定类型 B 和从 Option[A] 到 B 的映射,存在唯一映射从 Option[A] 到 B。homepages.inf.ed.ac.uk/wadler/papers/free-rectypes/…(从维基百科链接)也暗示初始 F 代数的点是针对递归数据类型的。 -
此外,如果您允许常量函子,那么对于任何类型
T,您可以考虑函子F[X] = T。那么一个 F 代数就是一个简单的类型B和一个从T到B的映射g。T立即是初始代数,并且转模只是将g应用于T类型的对象。这似乎是正在发生的事情,因为 Option[A] 是A和Nothing的副产品,并且从Option[A]到B的映射拆分为从A到B的映射和一个映射从Nothing到B,符合fold在Option上的类型签名。
标签: scala category-theory scala-option catamorphism recursion-schemes