我想使用 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 也非常陌生,因此我非常希望得到一些关于如何更好/简洁/标准地传达概念的指点。我很难为这篇文章写一个标题。
使用
failover
和ix
: