[Haskell-cafe] Importing Control.Arrow changes inferred type of
(m >>= f) x in ghci
Luke Palmer
lrpalmer at gmail.com
Tue Jul 28 00:04:20 EDT 2009
On Mon, Jul 27, 2009 at 7:58 PM, Dan Weston<westondan at imageworks.com> wrote:
> The following inferred type has a constraint that can be trivially
> satisfied, but isn't:
>
> Control.Monad> :t \ (m,f,x) -> (m >>= f) x
> \ (m,f,x) -> (m >>= f) x
> :: forall t a b. (Monad ((->) t)) => (t -> a, a -> t -> b, t) -> b
>
> -- In Control.Monad there is forall t. instance Monad ((->) t),
> -- so why is the vacuous Monad constraint still there?
> -- Nor can I remove it with a type annotation:
That instance is in the annoying module Control.Monad.Instances.
>
> Control.Monad> :t \ (m,f,x) -> (m >>= f) x :: forall t a b. (t -> a, a -> t
> -> b, t) -> b
>
> <interactive>:1:13:
> Inferred type is less polymorphic than expected
> [snip]
>
> -- Then if I just import a module:
> Control.Monad> :m + Control.Arrow
Presumably it is also here.
>
> -- Now, the Monad ((-> t) constraint disappears:
>
> Control.Monad Control.Arrow> :t \ (m,f,x) -> (m >>= f) x
> \ (m,f,x) -> (m >>= f) x
> :: forall t a b. (t -> a, a -> t -> b, t) -> b
>
> -- Although it still will not accept an explicit type annotation:
> Control.Monad Control.Arrow> :t \ (m,f,x) -> (m >>= f) x :: forall t a b. (t
> -> a, a -> t -> b, t) -> b
This is just because :: binds tighter than lambda, I think:
>>> :t (\(m,f,x) -> (m >>= f) x) :: forall t a b. (t -> a, a -> t -> b, t) -> b
typechecks just fine.
Luke
More information about the Haskell-Cafe
mailing list