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?