gpt4 book ai didi

scala - 为什么棱镜设置函数不返回选项/也许

转载 作者:行者123 更新时间:2023-12-02 02:15:18 28 4
gpt4 key购买 nike

在功能光学中,一个性能良好的棱镜(我相信在 scala 中称为部分透镜)应该具有 'subpart -> 'parent -> 类型的 set 函数'parent,如果棱镜“成功”并且在结构上与给定的 'parent 参数兼容,则它返回给定的 'parent 以及适当的子部分修改为给定 'subpart 值。如果棱镜“失败”并且在结构上与'parent参数不兼容,则它将返回未修改的'parent
我想知道为什么 prism 不返回 'parent option (Haskellers 的 Maybe)来表示 set 函数的通过/失败性质?难道程序员不应该能够从返回类型判断设置是否“成功”吗?

我知道在功能光学领域已经进行了大量的研究和思考,所以我确信一定有一个我似乎找不到的明确答案。

(我有 F# 背景,因此如果我使用的语法对于 Haskell 或 Scala 程序员来说有点不透明,我深表歉意)。

最佳答案

我怀疑是否有一个明确的答案,所以我在这里给你两个。

来源

我相信棱镜最初被想象为“共透镜”(如果我模糊的内存正确的话,是丹·多尔(Dan Doel))。而从 sa 的镜头则提供

get :: s -> a
set :: (s, a) -> s

sa报价的棱镜

coget :: a -> s
coset :: s -> Either s a

所有箭头都反转,并且乘积 (,) 被余积 Either 取代。因此,类型和功能范畴中的棱镜是双重范畴中的透镜。

对于简单的棱镜,s -> Either s a 似乎有点奇怪。为什么要恢复原来的值?但lens 套件还提供类型改变光学器件。所以我们最终得到

get :: s -> a
set :: (s, b) -> t

coget :: a -> s
coset :: t -> Either s b

突然之间,我们在不匹配的情况下得到的结果实际上可能有点不同!那是关于什么的?这是一个例子:

cogetLeft :: a -> Either a x
cogetLeft = Left

cosetLeft :: Either b x -> Either (Either a x) b
cosetLeft (Left b) = Right b
cosetLeft (Right x) = Left (Right x)

在第二种(不匹配)情况下,我们返回的是相同的,但其类型已更改。

良好的层次结构

对于 Van Laarhoven(如 lens)和 profunctor 风格的框架,透镜和棱镜也可以代替遍历。为此,它们需要具有相似的形式,而本设计实现了这一点。 leftaroundabout 的回答提供了有关这方面的更多详细信息。

关于scala - 为什么棱镜设置函数不返回选项/也许,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46384203/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com