镜头:用“over”产生 Maybe

问题描述 投票:0回答:1

我想使用lens创建一个函数来更新HashMap键(如果存在);如果键不存在,则该函数的计算结果为 Nothing。这是我迄今为止的尝试..

module Foo where
import Data.HashMap.Strict (HashMap, empty)
import Control.Lens

foo :: HashMap String Integer
foo = empty

-- I want this to be:
-- bar :: Maybe (HashMap String Integer)
bar :: HashMap String Integer
bar = over (at "1") (\_ -> Just 2) foo

这是我最终想要做的事情的简化示例——镜头路径实际上是

Dex.exprs . at exprId . Dex.children
,所以我也希望能够访问“at”之后的路径中更远的字段。但如果“at”聚焦 Nothing,则整个表达式的计算结果应为 Nothing。

我对 Haskell 也很陌生,所以我希望能得到关于更好/简洁/标准地传达概念的指导。我很难为这篇文章写标题。

感谢您的考虑。

haskell haskell-lens
1个回答
0
投票

使用

failover

bar :: Maybe (HashMap String Integer)
bar = failover (at "1") (\_ -> Just 2) foo
© www.soinside.com 2019 - 2024. All rights reserved.