我认为镜头在访问深层嵌套数据时非常有用,但是一些"容器"(如MVar
或TVar
)经常破坏了镜头的某些好的性质。
例如:
data SomeStruct = SomeStruct { _b :: Int
}
makeLenses ''SomeStruct
data AppState = AppState { _a :: SomeStruct
}
makeLenses ''AppState
data App = App { _state :: AppState
}
makeLenses ''App
我可以使用非常好的从左到右组合来制作新的镜头:
let v = App (AppState (SomeStruct 3))
in v^.state.a.b
然而,如果
_state
的类型是TVar,那么从左到右的组合就会崩溃,使用镜头会感觉非常笨重:t <- newTVarIO $ AppState (SomeStruct 3)
let v = App t
atomically $ (^.a.b) <$> readTVar (v^.state)
^.a.b
被推到左侧,尽管^.state
是最内层的lens。有没有更加人性化的方式来处理这些“容器”类型和lenses?