On Mon, Jul 27, 2009 at 7:58 PM, Dan Weston<[email protected]> 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 _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
