gpt4 book ai didi

haskell - 使用镜头访问仿函数内的数据

转载 作者:行者123 更新时间:2023-12-02 17:47:15 24 4
gpt4 key购买 nike

我发现镜头对于访问深度嵌套的数据非常有用,但像 MVarTVar 这样的“容器”经常会失去镜头的一些良好特性。

例如:

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)
尽管 ^.state 是最里面的镜头,但

^.a.b 仍被推到左侧。有什么方法可以以更符合人体工程学的方式处理这些“容器”类型和镜头吗?

最佳答案

有一个名为 lens 的库(以前是 lens-action 的一部分)这有助于将 setter/getter 和折叠与单子(monad) Action 混合在一起,而不会将您从透镜世界中拉出太多。

例如,对于类型

data App = App { _state :: TVar AppState }

我们可以写

ghci> :t \v -> v^!state.act readTVar.a.b
\v -> v^!state.act readTVar.a.b :: App -> STM Int

我们的想法是,我们不使用典型的 View 函数 (^.),而是使用其对应的一元函数 (^!) 。我们使用 act 等函数插入一元操作。或acts 。普通的 getter 和折叠不需要被提升,组合仍然用简单的 (.) 完成。

关于haskell - 使用镜头访问仿函数内的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49829104/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com