[Haskell-beginners] What's the type of function "abs"?

Frerich Raabe raabe at froglogic.com
Wed Mar 11 13:28:05 UTC 2015


Hi,

On 2015-03-11 14:21, Zhang Hengruo wrote:
> My absolute value function looks like this:
> 
> abs2 :: Num a => a -> a
> abs2 n = if n >= 0 then n else 0 - n
> 
> GHCi tells me that I should add Ord type class to its definition. Well, it's 
> true. It has used relational operators and Num isn't a subclass
> of Ord.
> However, when I input ":t abs" in GHCi, the interpreter shows "abs :: Num a 
> => a -> a". I read GHC/Num.lhs and find that abs is defined as
> "abs :: a -> a" and has no concrete content. So I think the abs function is 
> written in C as a module to implement directly and the type of abs
> just follows its class GHC.Num. Is it right? Or there are any other reasons?

'abs' is a function defined on the 'Num' class, i.e. any instance of 'Num' 
(such as 'Num Int') may define 'abs' as it pleases. See

   http://hackage.haskell.org/package/base-4.7.0.2/docs/src/GHC-Num.html#abs

for a few instantiations of the 'Num' class. In particular, concrete 
instances of the class know the actual type of 'a'. For instance, the 
definition of 'Num Int' could actually use '>=' because there's indeed an Ord 
instance for Int. In other cases, e.g. 'Num Word', 'abs' is just the identity 
function, i.e. 'abs x = x' since there are no non-positive Word values.

-- 
Frerich Raabe - raabe at froglogic.com
www.froglogic.com - Multi-Platform GUI Testing


More information about the Beginners mailing list