[Haskell-cafe] Vanishing polymorphism
Matthew Sackman
matthew at wellquite.org
Tue May 8 17:10:08 EDT 2007
Hi,
To cut a long story short, could someone explain why:
> :t negate
negate :: forall a. (Num a) => a -> a
> :t let f (fn :: forall a . Num a => a -> a) r s = (fn r, fn s) in f negate
let f (fn :: forall a . Num a => a -> a) r s = (fn r, fn s) in f negate
:: forall r s. (Num r, Num s) => r -> s -> (r, s)
but
> :t let f r s = (return negate) >>= (\fn -> return (fn r, fn s)) in f
let f r s = (return negate) >>= (\fn -> return (fn r, fn s)) in f
:: forall a (m :: * -> *). (Num a, Monad m) => a -> a -> m (a, a)
and
> :t let f r s = (return negate) >>= (\(fn::forall n . (Num n) => n -> n) -> return (fn r, fn s)) in f
<interactive>:1:35:
Couldn't match expected type `a -> a'
against inferred type `forall n. (Num n) => n -> n'
In the pattern: fn :: forall n. (Num n) => n -> n
In a lambda abstraction:
\ (fn :: forall n. (Num n) => n -> n) -> return (fn r, fn s)
In the second argument of `(>>=)', namely
`(\ (fn :: forall n. (Num n) => n -> n) -> return (fn r, fn s))'
I.e. why does the polymorphism get destroyed?
Cheers,
Matthew
--
Matthew Sackman
http://www.wellquite.org/
More information about the Haskell-Cafe
mailing list