这个问题的答案表明,在Scala中,Option的fold方法是一个catamorphism。从维基百科上可以看到,catamorphism是“从初始代数到其他代数的唯一同态。该概念已应用于函数式编程中的折叠”。所以这似乎是合理的,但我需要了解F-代数类别中的初始代数作为初始对象。
因此,如果Option上的fold确实是一个catamorphism,就需要有某个函子F来创建F-代数类别,其中Option将是初始对象。我无法确定这个函子是什么。
对于类型为
只是为了明确,我意识到Option已经是一个函子,它将
因此,如果Option上的fold确实是一个catamorphism,就需要有某个函子F来创建F-代数类别,其中Option将是初始对象。我无法确定这个函子是什么。
对于类型为
A
的列表,函子F
是F[X] = 1 + A * X
。这是有道理的,因为列表是一种递归数据类型,所以如果X
是List[A]
,那么上面的内容表示类型为A
的列表要么是空列表(1
),要么是一个A
和一个List[A]
的对组(*
)。但是选项不是递归的。Option[A]
只是1 + A
(Nothing或A
)。所以我不知道函子在哪里。只是为了明确,我意识到Option已经是一个函子,它将
A
变成Option[A]
,但是对于列表所做的事情是不同的,A
是固定的,并且使用函子来描述如何递归构造数据类型。
顺带一提,如果不是一个 catamorphism,它可能不应该被称为 fold,因为这会导致一些 混淆。
F
必须是递归的基础是什么?许多代数数据类型并不是递归的。无论如何,你总可以“作弊”,写出类似F[X] = 1 + Const A X
的东西。 - Travis BrownF[X] = 1 + Const A X
和F[X] = 1 + A
所表示的函子相同吗?(将每个类型映射到Option[A]
的函子。)我认为这是成立的,但这么简单以至于我认为应该会有更多内容。在此 F 下,任何 F-代数都只是具有从 Option[A] 到 B 的映射的类型 B。那么初始性质就是说,给定一个类型 B 和从 Option[A] 到 B 的映射,存在一个唯一的从 Option[A] 到 B 的映射。http://homepages.inf.ed.ac.uk/wadler/papers/free-rectypes/free-rectypes.txt(链接自维基百科)还暗示了初始 F-代数的目的是对于递归数据类型。 - PatrickT
,您可以考虑函子F [X] = T
。然后,F-代数就是一个类型B
和从T
到B
的映射g
。T
立即成为初始代数,而catamoprhism只是将g
应用于类型T
的对象。这似乎就是发生的事情,因为Option [A]是A
和Nothing
的余积,从Option [A]
到B
的映射分裂为从A
到B
的映射和从Nothing
到B
的映射,这符合Option
上的fold
的类型签名。 - Patrick