[Haskell-cafe] adding the elements of two lists
Richard O'Keefe
ok at cs.otago.ac.nz
Mon Mar 26 04:55:17 CEST 2012
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.
More information about the Haskell-Cafe
mailing list