2016-01-13 59 views
4

假设我有一个像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))] 

什么是正确的方法来做到这一点?

回答

10

使用_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))] 
2

要设置一个值,你可以这样写:

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

为了得到一个值,你可以做同样的事情:

> m ^? ix 1 . _2 
Just 3