ANNOUNCE: GHC 6.8.3 Release Candidate
Simon PeytonJones
simonpj at microsoft.com
Mon Jun 2 03:50:18 EDT 2008
Interesting
* I think it is a Bad Idea for an application to assume
that the implementation of (f^n) will not multiply by 1.
Implementations of numeric algorithms probably make all sorts
of illdocumented assumptions about the algebraic properties
of numeric operations
* On the other hand, it's a bit stupid for the implementation
of (f^n) to multiply by 1, and Ian has, I think, already fixed this.
Simon
 Original Message
 From: glasgowhaskellusersbounces at haskell.org [mailto:glasgowhaskellusersbounces at haskell.org] On
 Behalf Of Serge D. Mechveliani
 Sent: 01 June 2008 18:34
 To: Ian Lynagh
 Cc: glasgowhaskellusers at haskell.org
 Subject: Re: ANNOUNCE: GHC 6.8.3 Release Candidate

 On Sun, Jun 01, 2008 at 03:34:00PM +0100, Ian Lynagh wrote:
 > On Sun, Jun 01, 2008 at 05:39:49PM +0400, Serge D. Mechveliani wrote:
 > >
 > > This is why res and 1*res are not equivalent in Haskell98 for
 > > res :: Num a => a.
 > >
 > > Am I missing something?
 >
 > The library functions assume that class instances obey some unwritten
 > laws; it's all a bit vague, but if your instances don't obey them then
 > you might find that things go wrong when using library functions. For
 > example, if your (*) isn't associative then (^) is going to give odd
 > results, and if the type of the second argument to (^) doesn't do
 > arithmetic in the normal way then very strange things could happen.
 >
 > Anyway, I've just tweaked the (^) definition again, so your code should
 > work in 6.8.3.


 Thank you.
 This helps  in that the public DoCon2.11 test will run (I hope).

 But I think that you have found a bug in the DoCon test program.
 Thank you.
 More precisely, here are my indeas.


 1. Generally, for t = Num a => a, the expessions res :: t and
 ((fromInteger 1) :: t) * res
 are not equivalent in Haskell98,
 and the compiler has not rigth to replace the former with the latter.
 Right?

 2. But I guess, our current questions are different:

 (2.1) For t = Num a => a, has a Haskell implementation for (f^n) :: t
 right to base on certain natural properties of the operation
 fromInteger :: Integer > t ?
 (2.2) Has a reliable mathematical application right to base on that
 for n > 0 the expression (f^n) :: Polynomial Integer
 does not imply computing fromInteger 1 :: Polynomial Integer
 ?

 Concerning (2.1): I do not know whether Haskell98 allows to rely on
 that f^3 is equivalent to (fromInteger 1)*(f^3).

 But concerning (2.2), I think that (independently of the question (2.1))
 a reliable mathematical application must not presume the above properties
 of (^) and fromInteger.

 Concerning f^3 :: UPol Integer in my test for DoCon:

 1) fromInteger _ :: UPol _ is defined as
 error "... use fromi instead".
 2) (*) is defined via polMul ...
 3) The expression f ^ 3 relies on the Haskell98 library for (^).
 The Haskell library defines (^) via (*)  all right.

 4) DoCon has the function `power' to use instead of (^),
 and its library avoids (^).
 But for n > 0, I considered f^n :: UPol _
 as also correct. Because the Haskell library performs this via repeated
 application of (*).
 And I thought that if n > 0, then (fromInteger _ :: UPol _) will not
 appear.
 Maybe it does not appear in old GHCs and does appear 6.8.3 ?

 I was using expressions like [(f ^ n) :: UPol Integer  n < [2 .. 9]]
 in my _test programs_ for DoCon.
 But this relies on a particular property of the Haskell library definition
 for (f^n) :: a
  on that if n > 0 then (fromInteger _ :: a) does not appear in this
 computation.

 Now, I think, either I need to hide the standard (^) and overload it
 or to replace (^) with `power' in my examples too.

 Regards,

 
 Serge Mechveliani
 mechvel at botik.ru






 _______________________________________________
 Glasgowhaskellusers mailing list
 Glasgowhaskellusers at haskell.org
 http://www.haskell.org/mailman/listinfo/glasgowhaskellusers
More information about the Glasgowhaskellusers
mailing list