如何编写返回Maybe的镜头(Haskell)

7
假设我有一个像at _这样的镜头,需要一些Maybe a:
import Data.Map as M
m = M.fromList [(1,(2,3))]
--set 2nd element
m ^. at 1 .~ Just (4,5) 
--gives fromList [(1,(4,5))]
m ^. at 1 .~ Nothing
--gives fromList ()

现在假设我想要与另一种镜头合成。这种镜头返回Maybe a类型的值,这阻止了直接合成。

m ^. at 1 . _2 .~ Just 4
--error
-- I want to get M.fromList [(1,(2,4))]

这该怎么做才是正确的呢?

2个回答

13

使用_Just 球棒在 Map 中设置值,条件是键是否存在。这就是球棒的用途!

λ> let m = fromList [(1, (2, 3))]
λ> m & at 1 . _Just . _2 .~ 4
fromList [(1,(2,4))]
λ> m & at 100 . _Just . _2 .~ 4
fromList [(1,(2,3))]

3

要设置一个值,你只需要写:

> m & ix 1 . _2 .~ 4
fromList [(1,(2,4))]

为了获取一个值,你可以执行类似的操作:
> m ^? ix 1 . _2
Just 3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接