作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力适应 lens
Haskell 的库,发现自己在一些简单的问题上苦苦挣扎。例如,假设(为方便起见)at
和 _1
有以下类型(至少我是这样理解它们的):
at :: Ord k => k -> Lens' (Map k v) (Maybe v)
_1 :: Lens' (a, b) a
maybeFst :: Ord k => k -> Lens' (Map k (a, b)) (Maybe a)
最佳答案
你想要一个像这样的镜头
Lens' (Maybe (a, b)) (Maybe a)
Lens
自从放回
Nothing
影响
b
也是。可以是
Getter
getA :: Getter (Maybe (a, b)) (Maybe a)
getA = to (fmap fst)
Getter
同样,不是完整的
Lens
maybeFst :: Ord k => k -> Getter (Map k (a, b)) (Maybe a)
maybeFst k = at k . getA
Traversal
反而
maybeFstT :: Ord k => k -> Traversal' (Map k (a, b)) a
maybeFstT k = at k . _Just . _1
preview
或
toListOf
)并在
fst
处设置值 map 中的值,但您将无法修改其在 map 中的存在:如果该值不存在,则无法添加它,如果存在则无法删除它。
Lens
它具有适当的类型,尽管我们必须给它一个默认值
b
getA :: b -> Lens' (Maybe (a, b)) (Maybe a)
getA b inj Nothing = (\x -> (,b) <$> x) <$> inj Nothing
getA _ inj (Just (a, b)) = (\x -> (,b) <$> x) <$> inj (Just a)
Lens
喜欢的行为。
>>> Just (1, 2) & getA 0 .~ Nothing & preview (_Just . _2)
Nothing
>>> Nothing & getA 0 .~ Just 1
Just (1,0)
关于haskell - 如何组合镜头和仿函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22363189/
我是一名优秀的程序员,十分优秀!