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

scala – 为什么prism set函数不返回Option / Maybe

发布时间:2020-12-16 09:03:27 所属栏目:安全 来源:网络整理
导读:在功能光学中,一个表现良好的棱镜(我相信在 scala中称为部分透镜)应该具有类型’子部分 – 的设定函数. ‘父母 – ‘parent,如果棱镜“成功”并且在结构上与给定的’parent参数兼容,那么它将返回’父级给出的相应子部分被修改为给出’子部分值.如果棱镜“失
在功能光学中,一个表现良好的棱镜(我相信在 scala中称为部分透镜)应该具有类型’子部分 – >的设定函数. ‘父母 – > ‘parent,如果棱镜“成功”并且在结构上与给定的’parent参数兼容,那么它将返回’父级给出的相应子部分被修改为给出’子部分值.如果棱镜“失败”并且在结构上与’parent参数不兼容,那么它将返回’未经修改的’父级.
我想知道为什么棱镜没有返回’父选项(也许是 Haskellers)来表示set函数的通过/失败性质?程序员是否应该能够从返回类型中判断该集合是否“成功”?

我知道有很多研究和思想都投入到功能光学领域,所以我肯定必须有一个我似乎无法找到的确定答案.

(我来自F#背景,所以如果我使用的语法对Haskell或Scala程序员有点不透明,我很抱歉).

解决方法

回答“为什么” – 镜头等非常严格地从类别理论中得出,所以这实际上非常明确 – 你所描述的行为只是从数学中剔除,它不是任何人为任何目的而定义的东西,而是从远处来看更一般的想法.

好吧,那真的不太令人满意.

不确定其他语言的类型系统是否足够强大来表达这一点,但原则上在Haskell中,棱镜是遍历的特例.
遍历是一种“访问”某些“容器”中所有“元素”的出现方式.经典的例子是

mapM :: Monad m => (a -> m b) -> [a] -> m [b]

这通常用作

Prelude> mapM print [1..4]
1
2
3
4
[(),(),()]

这里的重点是:对动作/副作用进行排序,并将结果收集到一个容器中,其结构与我们开始时的结构相同.

棱镜的特殊之处在于容器被限制为包含一个或零个元素?(而一般遍历可以覆盖任意数量的元素).但是集合运算符并不知道这一点,因为它更严格一般.好的一点是,你可以在镜头,棱镜或mapM上使用它,并且总能获得合理的行为.但这不是“在结构中插入一次或者告诉我它是否失败”的行为.

并不是说这不是一个明智的操作,只是它不是镜头库所谓的“设置”.您可以通过显式匹配和重新构建来完成:

set? :: Prism s a -> a -> s -> Maybe s
set? p x = case matching p x of
    Left _ -> Nothing
    Right a -> Just $a ^. re p

?更确切地说:棱镜分离案件:一个容器可能包含一个元素,除此之外别无其他任何东西,或者它可能没有元素但可能没有相关的东西.

(编辑:李大同)

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

    推荐文章
      热点阅读