[Hugs-bugs] monomorphism bug
Ross Paterson
ross at soi.city.ac.uk
Mon Nov 1 11:46:59 EST 2004
I can't track this one down, so I'll post it:
Prelude> :t let f = const 1 in let g = f in g
let {...} in (let {...} in g) :: Num a => b -> c
The error here is that a and c should be identified. In larger examples,
this can cause real trouble.
More detail: f is subject to the Monomorphism Restriction, so its
return type should be monomorphic. Hugs gets this right, as seen in
Prelude> :t let f = const 1 in (f,f)
let {...} in (f,f) :: Num a => (b -> a,c -> a)
However it loses the constraint on the type of g, as seen in
Prelude> :t let f = const 1 in let g :: a -> b; g = f in g
let {...} in (let {...} in g) :: Num a => b -> c
(which it should reject). It seems essential that the type of f contain
fully polymorphic variables as well as the constrained one.
More information about the Hugs-Bugs
mailing list