2014-02-28 21 views
10

許多鏡頭獲得者返回Maybe值。我經常需要用一些默認值替換它們。從默認值鏡頭獲得可能性

說地圖查找但默認。

fromMaybe "" $ Map.fromList [(1,"Foo")] ^? at 1 

這可以用鏡頭語法書寫嗎?也許一些接近這一點:

Map.fromList [(1,"Foo")] ^? at 1.or "" 

回答

10

我想你想要的是

non :: Eq a => a -> Iso a (Maybe a) 

non foo本質上是做

case someMaybe of 
    Nothing -> foo 
    Just a -> a 

在你的情況

someMap ^. at 1 . non "" 

巧合的是,THI s正好是nondocs給出的例子。

如果你想與ix你的運氣了用這個,但你總是可以做

-- Import Data.Monoid 
defaulting :: a -> s -> Getting (First a) s a -> a 
defaulting a s fold = fromMaybe a $ s ^? fold 

foo = defaulting 0 [1, 2, 3] $ ix 3 -- 0 
+0

真棒感謝!按我的意願工作。我不知道他們爲什麼把它命名爲非?奇怪的名字。 「或」會更清晰。 –

+0

@VagifVerdi它應該是'a'的一個映射,沒有任何值提供給'也許a',所以在這個意義上它更有意義 – jozefg

+0

嗯,結果在某些情況下不起作用。與^一起工作。在,不適用於^?九。有沒有辦法將它以某種方式應用於ix? –