2013-04-02 26 views
9

我正在使用鏡頭包,並且一直在考慮必須有一個簡單的解決方案來解決以下問題。說我有一些地圖(或任何At實例)和它的價值型鏡頭,即使用鏡頭庫編寫部分吸氣劑

aMap :: Map Int a 
aLens :: Simple Lens a b 

我想一個getter

g :: Getter (Map Int a) (Maybe b) 

這是因爲我經常想這樣做

x :: Maybe b 
x = aMap^.at 3.g.aLens 

當然,預期的語義是,你得到一個Just值,當你在at查找和Nothing這樣做,否則。

當一個人設定,而不是領traverse作品代替g,即

newMap = at 3.traverse.aLens .~ whatever $ aMap 

但不是當你得到。是否有一些已經內置在鏡頭庫的鏡頭,我只是錯過了,還是有另一種簡單的方法來實現這一點在一個單一的表達?

回答

4

我一直在遇到類似的問題,試圖與at構成鏡頭。

如果您在這裏不需要插入/刪除行爲at,那麼使用ix怎麼辦?

x :: Maybe b 
x = aMap ^? ix 3 . aLens 
3

我已經設法拿出

x :: Maybe b 
x = aMap^.at 3 <&> (^.aLens) 

這是一個有點混亂,而不是正是我一直在尋找,但能夠完成任務。