gpt4 book ai didi

haskell - 我什么时候应该使用 MonadState 镜头组合器?

转载 作者:行者123 更新时间:2023-12-01 00:37:54 24 4
gpt4 key购买 nike

据我所知 MonadState s m使我能够获取和更新 s .

然而,我不明白这种状态如何与镜头组合器中使用的状态相关,如 assign .特别是当镜头可以对多个目标进行操作时。此外,还有更简单的函数,如 set不需要状态。

每个类似组合器的用例是什么?

最佳答案

我建议您阅读这篇关于在 MonadState 内使用镜头的优秀博客文章.它为您提供了 Haskell 有多棒的例子。

http://www.haskellforall.com/2013/05/program-imperatively-using-haskell.html

关于您关于 assign 之间差异的问题和 set :assign只是set的一个版本在内部运行 MonadState .就是这样。您可以通过实现观察到这一事实。

让我举一些例子。

您可以使用 set只是设置(抱歉重复)某个对象的某个字段:

ghci> set _2 42 ([0.1, 0.2], 3)
([0.1,0.2],42)

如果您想使用 assign你需要在一些 State 内部调用这个函数语境。例如考虑下一个简单的函数:
assignMe :: Int -> StateT ([Double], Int) IO ()
assignMe x = do
before <- get
liftIO $ putStrLn $ "before assignment: " ++ show before
assign _2 x
after <- get
liftIO $ putStrLn $ "after assignment: " ++ show after

如果你现在在 ghci 中调用这个函数,你可以观察它的执行结果:
ghci> execStateT (assignMe 42) ([0.1,0.2], 3)
before assignment: ([0.1,0.2],3)
after assignment: ([0.1,0.2],42)
([0.1,0.2],42)

就是这样。 assign只是表现得像 set除了它将镜头应用于状态。

关于haskell - 我什么时候应该使用 MonadState 镜头组合器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39184607/

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