Получение возможно из объектива со значением по умолчанию

Много объективов getters return Возможно значения. И мне часто приходится заменять их по умолчанию.

Сканировать поиск по карте, но по умолчанию.

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

Может ли это быть написано с синтаксисом линзы? Может быть, что-то близкое к этому:

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

Ответ 1

Я думаю, что вы хотите

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

non foo существенно

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

В вашем случае

 someMap ^. at 1 . non ""

Кстати, это как раз пример non docs.

Если вы хотите использовать это с 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