On 26/03/2012, at 12:51 PM, Chris Smith wrote:
> More concretely, it's not hard to see that the additive identity is 
> [0,0,0...], the infinite list of zeros.  But if you have a finite list x, 
> then x - x is NOT equal to that additive identity!

Said another way:  if you do want [num] to support + and -, then you DON'T
want the definitions of + and - to be unthinking applications of zipWith.

The approach I took the time I did this (before I learned better) was this:

        smart_cons :: Num t => t -> [t] -> [t]
        smart_cons 0 [] = []
        smart_cons x xs = x : xs

        instance Num t => Num [t]
          where  (x:xs) + (y:ys) = smart_cons (x+y) (xs + ys)
                 xs     + []     = xs
                 []     + ys     = ys
                 ...
                fromInteger 0 = []
                fromInteger n = [n]
                ...

so that a finite list acted _as if_ it was followed by infinitely many zeros.
Of course this wasn't right either: if the inputs don't have trailing zeroes,
neither do the outputs, but if they _do_ have trailing zeros, [0]+[] => [0]
when it should => [].  That was about the time I realised this was a bad idea.



_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to