何时应该使用MonadState镜头组合器?

4
我知道一个MonadState s m可以让我获取和更新一个s
然而,我并不理解这种状态与镜头组合器(如assign)中使用的状态有何关联。特别是当lens可以操作多个目标时。此外,还有一些更简单的函数(如set)不需要状态。
这些类似组合器的用例是什么?
1个回答

4
我建议你阅读这篇关于在MonadState中使用镜头的博客文章。它为你提供了Haskell的强大示例。 http://www.haskellforall.com/2013/05/program-imperatively-using-haskell.html 关于你提到的assignset之间的区别: assign只是在MonadState中操作的一个版本set。就是这样。你可以通过实现来观察这个事实。
让我举几个例子。
您可以使用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 一样,只不过它会将 lens 应用于 state


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接