[Haskell-cafe] Funny State monad dependency

Hans Aberg haberg at math.su.se
Wed Apr 16 09:41:24 EDT 2008


On 16 Apr 2008, at 15:22, Daniel Fischer wrote:
> The point is the
>
> instance Monad ((->) a) where
>     return x = const x
>     f >>= g = \x -> g (f x) x
>
> which is defined in Control.Monad.Instances...

Thank you. I suspected there was an instance somewhere, and I wanted  
to know where it is defined.

>   (try in GHCI:
> Prelude> let f x y = x >>= (return y)
> Prelude> :t f
> f :: (Monad ((->) a), Monad m) => m a -> m b -> m b
> ).

It works in Hugs too. If I don't import Control.Monad.State, then
   f :: (Monad a, Monad ((->) b)) => a b -> a c -> a c

> This is imported into Control.Monad.State and hence the instance is
> visible.
>
> By the type of (>>=), (return y) must have type (a -> m b), on the  
> other hand,
> if y has type c, then (return y) has type (m' c) for some monad m'.  
> Unifying
> m' c and a -> m b gives then m' === ((->) a) and c === m b.
> Now according to the instance, return y === const y, so f is the  
> same as
> g x y = x >>= (const y).

Good to know the details. Thanks.

   Hans




More information about the Haskell-Cafe mailing list