[Haskell-beginners] State Monad: how to use other Stateful computation on sub-state inside
martin
martin.drautzburg at web.de
Fri Oct 16 20:28:47 UTC 2015
Hello all,
I found myself writing this piece of code:
-- | Create and add a new 'Item' to the system
sysAddItem :: ItmLabel -> ItmVolume -> ItmCapacity -> Position -> Instant
-> State System ItmId
sysAddItem lbl vol cap pos t = do
sys <- get
id <- sysNextId :: State System Id
itms' <- return $ execState (itmAdd' (Itm id lbl vol cap pos t)) (sysItems sys) --**
modify (\sys -> sys{sysItems=itms'})
return id
In the lonely line ** in the middle I use
itmAdd' :: Item -> State ItemDb (),
where the ItemDb is part of the 'System' and can be extracted via sysItems. I believe this code is correct, but I don't
like it.
The expression to the right of <- must have the type
State System ItemDb
But ItemAdd' has the type
Item -> State ItemDb ()
So I need to transform
(Item -> State ItemDb ()) to (State System ItemDb).
There is no question that I have to pass the Item, but the transformation of the States is quite noisy. Is there a
better way to make this transformation, given a function System->ItemDb (i.e. sysItems)?
More information about the Beginners
mailing list