
John Goerzen wrote:
Hi folks,
I have uploaded a new package to Haskell: convertible. At its heart, it's a very simple typeclass that's designed to enable a reasonable default conversion between two different types without having to remember a bunch of functions.
I once again point out that realToFrac is *wrong* for converting from Float or Double. > realToFrac (1/0::Float) ::Double 3.402823669209385e38 > > realToFrac (0/0::Float) ::Double -5.104235503814077e38 > realToFrac (0/0::Double) ::Float -Infinity > realToFrac (1/0::Float) ::Rational 340282366920938463463374607431768211456%1 > > realToFrac (0/0::Float) ::Rational (-510423550381407695195061911147652317184)%1 > realToFrac (1/0::Double) ::Rational 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216%1 > > realToFrac (0/0::Double) ::Rational (-269653970229347386159395778618353710042696546841345985910145121736599013708251444699062715983611304031680170819807090036488184653221624933739271145959211186566651840137298227914453329401869141179179624428127508653257226023513694322210869665811240855745025766026879447359920868907719574457253034494436336205824)%1 These exceptional values are not uncommon and should be dealt with correctly. The code to do this is already written in logfloat:Data.Number.Transfinite[1], simply use the realToFrac method of the RealToFrac class instead of the Prelude's version which is broken. Since there is no total conversion from Float/Double to Rational, you can use the isInfinite and isNaN members of the Transfinite class to capture exceptional values as errors. [1] http://hackage.haskell.org/cgi-bin/hackage-scripts/package/logfloat -- Live well, ~wren