【问题标题】:In what way is Scala's Option fold a catamorphism?Scala 的 Option fold 以何种方式变态?
【发布时间】:2014-07-06 14:45:30
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您认为F 必须 是递归的依据是什么?许多代数数据类型不是。在任何情况下,你总是可以“作弊”并写出类似F[X] = 1 + Const A X的东西。
  • F[X] = 1 + Const A XF[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 和一个从TB 的映射gT 立即是初始代数,并且转模只是将g 应用于T 类型的对象。这似乎是正在发生的事情,因为 Option[A] 是 ANothing 的副产品,并且从 Option[A]B 的映射拆分为从 AB 的映射和一个映射从Nothing到B,符合foldOption上的类型签名。

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


【解决方案1】:

嗯,cmets 是在正确的轨道上。我只是一个初学者,所以我可能有一些误解。是的,重点是能够对递归类型进行建模,但我认为没有什么可以排除“非递归”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(身份,代表递归位置)
  • *(产品)
  • +(副产品)

我找到的一个很好的参考是Functional Generic Programming

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

【讨论】:

    猜你喜欢
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 2018-02-13
    • 2016-10-12
    • 2020-07-17
    • 2015-04-19
    相关资源
    最近更新 更多