
I'm not sure what "sound" means if the documentation[1] for Num states that the only reasonable expectation is that of a ring. However, if we are to have laws for signum and abs, then I would expect that 'abs n = n * signum n'. My definitions satisfy that law. Furthermore for polynomials, I don't think there is a useful definition of 'abs' where 'abs n' has a higher degree than 'n' itself. Assuming that 'abs' does not increase the degree, I don't think there are any other _useful_ definitions of abs and signum than the ones I gave: multiplication in Z[X] will never decrease the degree, so the degree of 'n * signum n' is at least that of 'n', and therefore the degree of 'abs n' is the same as that of 'n'; therefore 'signum n' is a constant polynomial (without X'es). With that restriction the only reasonable choice I see is 'signum = const 1'. But even if you take 'abs' and 'signum' to be absolutely wild functions, to be able to write n*(n+1)/2 you need to define your division operator. There is certainly not one in base that will work for 'Int -> Int' as well as 'Float -> Float' as well as 'Poly Integer -> Poly Integer'. And in particular not abs nor signum. :) - Tom [1]: https://hackage.haskell.org/package/base-4.14.1.0/docs/Prelude.html#t:Num -------- Original Message -------- On 16 Dec 2020, 23:26, Henning Thielemann < lemming@henning-thielemann.de> wrote: On Wed, 16 Dec 2020, Tom Smeding wrote:
@Douglas:
What about the ring of polynomials over the integers, i.e. Z[X]? We can certainly define a Num instance for that
if we set 'signum _ = 1' and 'abs = id'. 'fromInteger' then injects constant polynomials.
I also thought about polynomials, but Num is a Ring plus 'signum' and 'abs'. Are your definitions ob 'signum' and 'abs' sound? Are there other sound definitions that may allow the n*(n+1)/2 magic?