Importing Control.Arrow changes inferred type of (m >>= f) x in ghci

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: 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 -- 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 <interactive>:1:13: Inferred type is less polymorphic than expected [snip] Is there some explicit kind annotation I can/should give to get the most general type? Dan

On Mon, Jul 27, 2009 at 7:58 PM, Dan Weston
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
participants (2)
-
Dan Weston
-
Luke Palmer