fromInteger

Marcin 'Qrczak' Kowalczyk qrczak@knm.org.pl
1 Jun 2001 18:34:46 GMT


Fri, 1 Jun 2001 15:25:24 -0700, Saswat Anand <iscp9157@nus.edu.sg> pisze:

> I can't understand how the arithmatic operators like (+),(-) are =
> defined and fromInteger works in that context.

They are all in class Num. fromInteger is automatically
inserted before all integer literals, e.g. '42' is equivalent to
'fromInteger (42::Integer)' and has type 'Num a => a', i.e. the
context can provide any numeric type and 42 will have that type
by using the appropriate fromInteger.

> Type Fun a = Int -> a
> 
> fun:: Fun Int
> fun = (+1)
> 
> instance (Num a) => Num (Fun a) where
>  .........
> 
> (fun + 2) 10 and (2 + fun) 10 works fine. But how does it know it
> has to use fromInteger?

(+):: Num a => a -> a -> a

>From this type it follows that both arguments of '+' must have the
same type (and that this type must be Num).

The first argument of '+' in 'fun + 2', i.e. 'fun', has a fully
determined type: 'Fun Int'. It follows that the second argument of
'+', i.e. '2', must be 'Fun Int' too.

It's an integral literal, so it can have any Num type. Unifying
'Num a => a' with 'Fun Int' succeeds and gives an answer what 'a'
is here: it's 'Fun Int', and it's ok because it's Num.

> But If I want these,
>   (Just 2 + fun) 10 and (fun + Just 2) 10
> to work, then is there a way to tell which conversion function
> to use?

No: 'Just 2' has type 'Num a => Maybe a', 'fun' has type 'Fun Int',
i.e. 'Int -> Int'. In no way 'Maybe something' can be the same type as
'arg -> result'.

-- 
 __("<  Marcin Kowalczyk * qrczak@knm.org.pl http://qrczak.ids.net.pl/
 \__/
  ^^                      SYGNATURA ZASTĘPCZA
QRCZAK