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