[Haskell-cafe] ST and Transformers

Pepe Iborra 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.
Right True

On the other hand, I try to define it firstly as below and got the  
following error.

 > 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?
> Thanks,
> /g
> -- 
> 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
> http://www.haskell.org/mailman/listinfo/haskell-cafe

More information about the Haskell-Cafe mailing list