2016-01-13 34 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