haskell - Why does `hoist` constrain the type parameter of this monad? -


i have function composes 2 monads:

comp :: monad m => m -> m b -> m b 

and 2 instances of such monads, on "inside" mfunctor,

ms :: monad m => m string ms = undefined  tma :: (monad m, mfunctor t) => t m tma = undefined 

now if try compose ms tma:

tmas = hoist (\ma -> comp ma ms) tma 

i getting error:

 not deduce (a ~ [char])     context (monad m, mfunctor t)       bound inferred type of                comp :: (monad m, mfunctor t) => t m b       @ coroutine.hs:607:1-40       `a' rigid type variable bound           type expected context: m -> m @ coroutine.hs:607:8     expected type: m       actual type: m string 

which states a in ms has of arbitrary type: ms :: monad m => m a.

why , there way compose tma monads of specific parameters.

i can see signature of hoist is:

hoist :: (monad m, mfunctor t) => (forall a. m -> n a) -> t m b -> t n b 

but cannot picture how forall affecting trying do, if has effect.

switch order of arguments comp this:

tmas = hoist (\ma -> comp ms ma) tma  -- or more simply: tmas = hoist (comp ms) tma 

the reason type of comp is:

comp :: (monad m) => m -> m b -> m b 

if set, ms second argument, b type-checks string , get:

(`comp` ms) :: (monad m) => m -> m string 

... if set ms first argument, a type-checks string get:

(ms `comp`) :: (monad m) => m b -> m b 

that latter type correct type hoist since b universally quantified (i.e. "forall"ed).

to answer question correctness, answer universal quantification guarantees argument hoist modifies monad layer , not monad return value. however, if it's intention modify return value, too, hoist not want.


Comments

Popular posts from this blog

design - Custom Styling Qt Quick Controls -

Unable to remove the www from url on https using .htaccess -