gpt4 book ai didi

haskell - 使用镜头访问不存在的字段时如何避免默认返回值?

转载 作者:行者123 更新时间:2023-12-03 15:15:42 24 4
gpt4 key购买 nike

我喜欢 Lens 库,也喜欢它的工作原理,但有时它会带来很多问题,以至于我后悔当初开始使用它。让我们看这个简单的例子:

{-# LANGUAGE TemplateHaskell #-}

import Control.Lens

data Data = A { _x :: String, _y :: String }
| B { _x :: String }

makeLenses ''Data

main = do
let b = B "x"
print $ view y b

它输出:
""

现在想象一下——我们有一个数据类型并且我们重构它——通过改变一些名字。镜头使用 mempty 代替此名称不再适用于特定数据构造函数的错误(在运行时,如使用普通访问器)来自 Monoid创建默认对象,所以我们得到奇怪的结果而不是错误。调试这样的事情几乎是不可能的。
有没有办法解决这种行为?我知道有一些特殊的操作符可以得到我想要的行为,但是镜头的所有“正常”外观功能都太可怕了。我应该用我的自定义模块覆盖它们还是有更好的方法?

作为旁注:我希望能够使用镜头语法读取和设置参数,但只需删除字段丢失时自动创建结果的行为。

最佳答案

听起来您只想恢复异常行为。我隐约记得,这就是 View 曾经的工作方式。如果是这样,我希望通过更改做出合理的选择。

通常,在您谈论的情况下,我最终会使用 (^?) :

> b ^? y
Nothing

如果你想要异常行为,你可以使用 ^?!
> b ^?! y
"*** Exception: (^?!): empty Fold

我更喜欢使用 ^?避免部分函数和异常,类似于通常建议远离 head , last , !!和其他部分函数。

关于haskell - 使用镜头访问不存在的字段时如何避免默认返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27567664/

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