[Haskell] State Transformers and Control.Monad.ST.Lazy

Vivian McPhail vivian.mcphail at paradise.net.nz
Sun Jun 20 22:55:22 EDT 2004


>From the very helpful posts of John Hughes and others concerning 
"Monadic Loops",  I've been advised to re-implement my neural net 
simulator using lazy state threads to avoid crashes to which recursive 
(and tail-recursive) monads lead.

I had been using monad transformers to lift IO operations:

data NeuralNet = NN { ... }

data NNO a = NNO (NeuralNet -> (a,NeuralNet))

data NNT m a = NNT (NeuralNet -> m (a,NeuralNet)) 

following the example of a state transformer in "Functional Programming 
with Overloading and Higher-Order Polymorphism".

I am trying to reimplement with 

data ST s a

from Control.Monad.ST.Lazy and "Lazy Functional State Threads"

however there is something I think I do not understand, that is the "s" in 
the ST dataype.  The compiler tells me it needs to be instantiated, but I am 
presuming that a type such as

type NNST = ST NeuralNet a

is useless because there is no way (from this module) to access that 
state using the "update" method of the MonadState class.

1. Am I correct in thinking that I need to use a monad transformer lifting 
from the ST monad to incorporate my NeuralNet datatype

2. Can I merely instantiate ST as ST () a?

Thanks in advance.

Vivian McPhail

More information about the Haskell mailing list