加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 19:13:47 所属栏目:安全 来源:网络整理
导读:对 this问题的回答表明,Scala中Option的折叠方法是一种catamoprhism.来自维基百科的 catamophism是“从初始代数到其他代数的独特同态.这个概念已经应用于函数式编程作为折叠”.所以这似乎是公平的,但引导我到 initial algebra作为 F-algebras类别的初始对象.
对 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(单位,代表空)
> K(常数,捕获值)
> I(身份,代表递归位置)
> *(产品)
>(副产品)

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读