[Haskell-cafe] ST and Transformers
mnislaih at gmail.com
Fri Dec 22 12:44:54 EST 2006
Hi J Garrett,
I don't see any problem in GHC 6.6. with:
> runTest c = runST (runErrorT c)
*Main> runTest (return True)
Loading package mtl-1.0 ... linking ... done.
On the other hand, I try to define it firstly as below and got the
> runTest = runST . runErrorT
Couldn't match expected type `forall t. Test t r'
against inferred type `ErrorT e m a'
Expected type: (forall t. Test t r) -> forall s. ST s a1
Inferred type: ErrorT e m a -> m (Either e a)
In the second argument of `(.)', namely `runErrorT'
In the expression: runST . runErrorT
Rank-2 types seem to interact badly with (.) and ($), but my type
theory educated neuron doesn't know why. I think this is folklore
On 22/12/2006, at 18:26, J. Garrett Morris wrote:
> Hello everyone,
> I recently found myself attempting to use ST at the base of a stack of
> transformers, ala:
> type Test t r = ErrorT String (ST t) r
> I imagined, given the type of ST, that I would need a run function
> along the lines of:
> runTest :: (forall t. Test t r) -> Either String r
> (which was, in fact, exactly what I wanted). Unfortunately, even with
> that type signature, I can't find a way to convince the compiler that
> the state thread is properly universal in the call to runST. Is it
> possible to write this function, or is ST (and other monads that use
> its style of threading) not transformable?
> It is myself I have never met, whose face is pasted on the
> underside of my mind.
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
More information about the Haskell-Cafe