[Haskell-beginners] Using a monad function inside the monad transfomer variant
Seph Shewell Brockway
seph at codex.scot
Fri Feb 1 17:57:17 UTC 2019
On Fri, Feb 01, 2019 at 03:14:32PM +0100, Moritz Tacke wrote:
> I still want to use the functions that return RVars, so eg.
> rvarDouble :: RVar Double
> and then the definition of the transformer function would be:
> someFunction a b =
> do ...
> the_double <- rvarDouble
> This does not compile, complaining that;
> • Couldn't match type ‘Data.Functor.Identity.Identity’ with ‘ST s’
> Expected type: RVarT (ST s) Double
> Actual type: RVar Double
> How can I re-user the RVar function in the RVarT monad transformer?
Your declaration of rvarDouble needs to be polymorphic in the monad:
rvarDouble :: Monad m => RVarT m Double
The crucial observation is that RVar is actually a type synonym for
RVarT Identity, so the function can still be made to return a plain
RVar Double, but it can also return an RVarT (ST s) Double, satisfying
the type-checker in the example that you gave.
Seph Shewell Brockway, BSc MSc (Glas.)
More information about the Beginners