
On Mon, Jun 13, 2005 at 03:29:21PM +0200, Gracjan Polak wrote:
Bernard Pope wrote:
Perhaps you could post the definition of the state type? Or even better, a small example of code that runs badly.
I still don't know where old code had problems, but after rewriting everything it seems to run smoothly now :) Thanks for all ideas, btw.
I "invented" something like this:
type RestAndState = (MyState -> [MyData]) -> MyState -> [MyData]
this is the type of funtions that take current state and continuation as parameters. Example:
putValues v1 v2 v3 rest state = [v1,v2,v3] ++ rest state
there is a bit of syntactic ugliness when state chages:
putValueEx v1 rest state = let newstate = state { ... } in [v1] ++ rest nstate
good thing is that function can be composed quite easily with ($):
putV v1 v2 v3 v4 rest = -- state skipped here :) putValue v1 v2 v3 $ putValueEx v4 rest
It works as I want it to. But I have strange feeling that there must be a better way to "compose" foldr and state... Does anybody have any idea how to put monad into this?
I haven't followed the thread from the beginning, but here is one way of expressing your examples, using State and foldr1: putValues :: a -> a -> a -> State s ([a] -> [a]) putValues v1 v2 v3 = return ([v1,v2,v3] ++) putValueEx :: a -> State s ([a] -> [a]) putValueEx v1 = do modify (\s -> undefined) return (v1 :) putV :: a -> a -> a -> a -> State s ([a] -> [a]) putV v1 v2 v3 v4 = foldr1 (liftM2 (.)) [putValues v1 v2 v3, putValueEx v4] test = evalState (putV 1 2 3 4) undefined [] I'm not sure exactly what you're trying to accomplish, but maybe this will give you some ideas. Andrew