从镜头获取默认值的Maybe

Vag*_*rdi 10 haskell haskell-lens

许多镜头吸气剂返回Maybe值.我经常需要用默认值替换它们.

说地图查找,但默认.

fromMaybe "" $ Map.fromList [(1,"Foo")] ^? at 1
Run Code Online (Sandbox Code Playgroud)

这可以用镜头语法编写吗?也许接近这个:

Map.fromList [(1,"Foo")] ^? at 1.or ""
Run Code Online (Sandbox Code Playgroud)

Dan*_*zer 10

我想你想要的是什么

non :: Eq a => a -> Iso a (Maybe a)
Run Code Online (Sandbox Code Playgroud)

non foo 基本上

 case someMaybe of
   Nothing -> foo
   Just a  -> a
Run Code Online (Sandbox Code Playgroud)

在你的情况下

 someMap ^. at 1 . non ""
Run Code Online (Sandbox Code Playgroud)

巧合的是,这恰恰是示例non的文档给.

如果你想使用它而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
Run Code Online (Sandbox Code Playgroud)