[Haskell-cafe] Importing Control.Arrow changes inferred type of (m >>= f) x in ghci

Dan Weston westondan at imageworks.com
Mon Jul 27 23:58:29 EDT 2009


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



More information about the Haskell-Cafe mailing list