[Haskell-cafe] Combining ST with STM

Thomas Koster tkoster at gmail.com
Tue Feb 9 13:13:14 UTC 2016


Alberto,

On 9 February 2016 at 14:43, Thomas Koster <tkoster at gmail.com> wrote:
> I have an STM transaction that needs some private, temporary state.
> The most obvious way is to simply pass pure state as arguments, but
> for efficiency, I would like this state to be some kind of mutable
> array, like STArray.

On 9 February 2016 at 22:29, Alberto G. Corona <agocorona at gmail.com> wrote:
> Why not use the state monad transformer?
>
> http://hackage.haskell.org/package/transformers-0.5.1.0/docs/Control-Monad-Trans-State-Lazy.html#t:StateT
>
> atomically $   evalStateT  todo initialState
>
> Seems Ok to me
>
> evalStateT :: Monad m => StateT s m a -> s -> m a
>
> in this case:
>
> evalStateT :: StateT MyState STM a -> MyState -> STM a

Thank you for your suggestion.

Certainly, if the state was an immutable value, small or otherwise
cheaply modified, like a finger tree spine, StateT would be a much
cleaner alternative. But unfortunately it is the mutability of the
STArray that makes it valuable to my application.

"StateT (Vector Value) STM" would not help me much as the state would
need to be copied every time it was modified. In fact, I used a
variation of this in a very early version of my program, except that
the Vector was passed even more simply: as an argument, the way
ReaderT does, with no actual transformer in sight. Switching over to
ST and passing an STArray instead has improved the throughput of my
program greatly (far more than I expect to see from any extra
parallelism I might gain from using STM).

--
Thomas Koster


More information about the Haskell-Cafe mailing list