One nice thing about haskell is that the source to most things is available on hackage. If you look at abs, here:

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

You will see two things:

1) abs is actually part of the Num typeclass, so can be defined differently for the different numerical types
2) the definition for Int is similar to yours:
    abs n  = if n `geInt` 0 then n else negate n

Notice `geInt` is just an int-specific (>=) operator. Because we're defining an instance we know the concrete type we're dealing with (the type is Int -> Int by this point, rather than a -> a), so we don't need to make use of Ord in this case.



11 Mar 2015 22:21、Zhang Hengruo <hengruo.z@gmail.com> のメッセージ:

I'm a newbie, knowing a little about Haskell, and hope my question isn't very silly...
=====================================================================
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? 

Thanks,

Hengruo
_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners