我试图找出最简洁的方法来修改嵌套在Maybe
类型(或其他用于建模偏爱的类型)中的值。
这是示例设置:
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
data Outer = Outer { _inner :: Maybe Inner }
deriving (Show)
data Inner = Inner { _foo :: Int }
deriving (Show)
makeLenses ''Outer
makeLenses ''Inner
通过以下方式以有点混乱的方式很容易做到这一点lens
:
wibble :: Outer -> Maybe Outer
wibble o = do i <- view inner o
let i' = over foo succ i
return $ set inner (Just i') o
为了说明为什么这很讨厌,这就是我希望能够写的内容:
wibble' :: Outer -> Maybe Outer
wibble' = overish inner.foo succ
overish = ???
查找字段失败只会导致整个操作失败,而不是让我在可能发生的每个点显式检查失败。
有什么建议么?我试过浏览各种lens
模块,但似乎没有什么能完全符合要求。