MonadState
中使用镜头的博客文章。它为你提供了Haskell的强大示例。
http://www.haskellforall.com/2013/05/program-imperatively-using-haskell.html
关于你提到的assign
和set
之间的区别: 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。