<p>&quot;Jonathan Grochowski&quot; &lt;<a href="mailto:jongrocho%2Bhs@gmail.com">jongrocho+hs@gmail.com</a>&gt; wrote:<br>
&gt; As Michael suggests using zipWith (+) is the simplest solution.<br>
&gt;<br>
&gt; If you really want to be able to write [1,2,3] + [4,5,6], you can define the instnace as<br>
&gt;<br>
&gt;     instance (Num a) =&gt; Num [a] where<br>
&gt;         xs + ys = zipWith (+) xs ys</p>
<p>You can do this in the sense that it&#39;s legal Haskell... but it is a bad idea to make lists an instance of Num, because there are situations where the result doesn&#39;t act as you would like (if you&#39;ve had abstract algebra, the problem is that it isn&#39;t a ring).</p>

<p>More concretely, it&#39;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!  Instead, you&#39;d only get a finite list of zeros, and if you try to do math with that later, you&#39;re going to accidentally truncate some answers now and then and wonder what went wrong.</p>

<p>In general, most type classes in Haskell are like this... the compiler only cares that you provide operations with certain types, but the type class also carries around additional &quot;laws&quot; that you should obey when writing instances.  Here there&#39;s no good way to write an instance that obeys the laws, so it&#39;s better to write no instance at all.</p>

<p>-- <br>
Chris Smith<br>
</p>