Revamping the numeric classes

Marcin 'Qrczak' Kowalczyk mk167280@students.mimuw.edu.pl
Thu, 8 Feb 2001 11:09:35 +0100 (CET)


On Thu, 8 Feb 2001, Tom Pledger wrote:

> nice answer: give the numeric literal 10 the range type 10..10, which
> is defined implicitly and is a subtype of both -128..127 (Int8) and
> 0..255 (Word8).

What are the inferred types for
    f = map (\x -> x+10)
    g l = l ++ f l
? I hope I can use them as [Int] -> [Int].

>         x + y + z                 -- as above
> 
>     --> (x + y) + z               -- left-associativity of (+)
> 
>     --> realToFrac (x + y) + z    -- injection (or treating up) done
>                                   -- conservatively, i.e. only where needed

What does it mean "where needed"? Type inference does not proceed
inside-out. What about this?
    h f = f (1::Int) == (2::Int)
Can I apply f to a function of type Int->Double? If no, then it's a
pity, because I could inline it (the comparison would be done on Doubles).
If yes, then what is the inferred type for h? Note that Int->Double is not
a subtype of Int->Int, so if h :: (Int->Int)->Bool, then I can't imagine
how h can be applied to something :: Int->Double.

-- 
Marcin 'Qrczak' Kowalczyk