[Haskell-cafe] Using a monad to decompose a function into
functions
minh thu
noteed at gmail.com
Thu Mar 12 18:21:30 EDT 2009
2009/3/12 Marcin Kosiba <marcin.kosiba at gmail.com>:
> Hi,
> I'm doing a bit of research into mobility models and I'm currently exploring
> implementation language choices for the simulator (yes, sadly it needs to be
> a custom one).
> I've been using Haskell here and there for some small tasks, and thought I
> should consider it as an implementation language for the simulator.
> While I already have an working implementation in Haskell, there is one thing
> that I would like to express in a more elegant way, but just can't figure
> out. The simulation algorithm requires expressing the node's mobility so that
> it is "stateless". The mobility model algorithm's type should be something
> like:
> mobility_model :: WorldState -> NodeState -> OtherInput -> (Action, NodeState)
>
> where Action can alter WorldState and the second NodeState is an altered input
> NodeState. I perform a form of speculative execution on mobility_model so
> sometimes I need to backtrack to a previous world and node state.
> This is all fairly simple stuff, and was just an introduction. What I do now
> is store an enum in NodeState and implement mobility_model as one big case
> statement. Yes, this is very imperative of me, I know. What I'd like to do is
> to express mobility_model, so that the code would look like:
>
> mobility_model world node input = do
> do_calculus
> emit_action
> if something
> then emit_action
> else emit_action
> do_calculus
> emit_action
> mobility_model world node input
Hi,
It seems you can use
http://hackage.haskell.org/packages/archive/mtl/latest/doc/html/Control-Monad-State-Lazy.html
Just have a look at the exemple :
tick :: State Int Int
tick = do n <- get
put (n+1)
return n
your code would become something like
mobility_model :: OtherInput -> State (WorldState,NodeState) ()
mobility_model input = do
world <- gets fst
node <- gets snd
....
let (world',node') = ...
put (world',node')
HTH,
Thu
More information about the Haskell-Cafe
mailing list