Scala的选项以什么方式折叠了一个变形?
对
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和列表[A]的一对(*).但Option不是递归的.选项[A]只是1 A(无或A).所以我没看到仿函数在哪里. 为了清楚起见,我意识到Option已经是一个仿函数,因为它需要A到Option [A],但对列表所做的是不同的,A是固定的,而仿函数用于描述如何递归构造数据类型. 在一个相关的说明,如果它不是一个catamorphism它可能不应该被称为折叠,因为这导致一些confusion. 解决方法
那么,评论是在正确的轨道上.我只是一个初学者,所以我可能有一些误解.是的,重点是能够对递归类型进行建模,但我认为没有什么能排除“非递归”F代数.由于初始代数是方程X~ = F X的“最不固定点”解决方案.在Option的情况下,解决方案很简单,因为没有涉及递归:)
初始代数的其他例子: List [X] = 1 A * X表示list = Nil |构成一个清单 树[X] = A A * X * X表示树=叶a |节点树树 以同样的方式: 选项[X] = 1 A表示选项=无|一些 存在“常量”仿函数的理由很简单,你如何表示树的节点? > U(单位,代表空) 我发现一个很好的参考是Functional Generic Programming 无耻的插件:我在scala-reggen中使用代码中的那些概念 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |