I recommend you to read this excellent blog post about using lens within MonadState
. It gives you examples of how awesome Haskell could be.
http://www.haskellforall.com/2013/05/program-imperatively-using-haskell.html
Regarding your question about difference between assign
and set
: assign
is just a version of set
that operates inside MonadState
. That's it. You can observe this fact through implementation.
Let me give some examples.
You can use set
to just set (sorry for repetition) some field of some object:
ghci> set _2 42 ([0.1, 0.2], 3)
([0.1,0.2],42)
If you want to use assign
you need to call this function inside some State
context. For example consider next simple function:
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
If you now call this function in ghci you can observe result of its execution:
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)
That's it. assign
just behaves like set
except it applies lens to state.