
On Fri, Jul 29, 2011 at 11:02:26AM -0400, Jake Penton wrote:
On 2011-07-29, at 10:02 AM, Daniel Seidel wrote:
On Fri, 2011-07-29 at 09:49 -0400, Jake Penton wrote:
For example, this does not compile:
f :: Fractional a => a f = 3.14
I can load this to ghci and also compile
Yeah, sorry - so can I. I must have screwed up earlier. Fat fingers, bleary eyes....
But, getting back to my point (or possibly making an unrelated one for all I know), how about this, which I *hope* I am right in saying does NOT compile, even though Bool is an instance of Ord:
g :: Ord a => a g = True
It still seems to me that the mere presence of a constraint does not make a difference by itself. Does the difference here lie in compiler calls to fromFractional or fromIntegral in appropriate cases?
Yes. The difference is that numeric literals are special -- they are polymorphic. 3 has type (Num a) => a, and 3.14 has type (Fractional a) => a. So, f :: Fractional a => a promises to be able to take on ANY fractional type, and sure enough, 3.14 can be any fractional type. However, g :: Ord a => a promises to be able to take on ANY Ord type, but True has type Bool, which is too specific. I should be able to write (for example) if g < 'x' then ... else ... using g at type Char (since Char is an instance of Ord), but you can easily see that this will not work if g = True. Hence the error. -Brent