<br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">&nbsp;It came up on IRC last night that there is no &quot;generic&quot; zip in<br>

 &nbsp;Haskell. I decided to write one as an example, but it only<br>
 &nbsp;half works.<br>
</blockquote><div><br>That depends on how you define &quot;generic.&quot; ;)<br><br>EMGM [1] has a generic zipWith [2]:<br><br><span style="font-family: courier new,monospace;">&gt; zipWith :: FRep3 ZipWith f =&gt; (a -&gt; b -&gt; c) -&gt; f a -&gt; f b -&gt; Maybe (f c)</span><br>
<br>This is generic according to the container type &#39;f&#39;. A particular specialization of this is zip:<br><br><span style="font-family: courier new,monospace;">&gt; zip :: FRep3 ZipWith f =&gt; f a -&gt; f b -&gt; Maybe (f (a, b))</span><br>
<br>[1] <a href="http://www.cs.uu.nl/wiki/GenericProgramming/EMGM">http://www.cs.uu.nl/wiki/GenericProgramming/EMGM</a><br>[2] <a href="http://hackage.haskell.org/packages/archive/emgm/0.1/doc/html/Generics-EMGM-Functions-ZipWith.html">http://hackage.haskell.org/packages/archive/emgm/0.1/doc/html/Generics-EMGM-Functions-ZipWith.html</a><br>

<br></div><blockquote style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;" class="gmail_quote"><a href="http://github.com/jsnx/haskell-demos/tree/master/generic_zip%2FGenericZip.hs">http://github.com/jsnx/haskell-demos/tree/master/generic_zip%2FGenericZip.hs</a></blockquote>
</div><br>From looking at your code, it appears that you want a zip that is generic according to arity. You also don&#39;t seem to care about the container type, since you have only lists. So, the above isn&#39;t really related.<br>
<br>Here&#39;s an adaptation of your code that works. Personally, I&#39;d probably use Template Haskell. This is not really generic at all. Rather it&#39;s an advertisement for overloading. ;)<br><br><span style="font-family: courier new,monospace;">&gt; {-# LANGUAGE FlexibleInstances #-}</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&gt; module GenericZip where</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&gt; import Prelude hiding (zip)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&gt; import qualified Prelude (zip)</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&gt; </span><span style="font-family: courier new,monospace;">class Zip f where</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&gt; </span><span style="font-family: courier new,monospace;">&nbsp; zip :: f</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&gt; </span><span style="font-family: courier new,monospace;">instance Zip ([a] -&gt; [a]) where</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&gt; </span><span style="font-family: courier new,monospace;">&nbsp; zip = id</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&gt; </span><span style="font-family: courier new,monospace;">instance Zip ([a] -&gt; [b] -&gt; [(a, b)]) where</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&gt; </span><span style="font-family: courier new,monospace;">&nbsp; zip = Prelude.zip</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&gt; </span><span style="font-family: courier new,monospace;">instance Zip ([a] -&gt; [b] -&gt; [c] -&gt; [(a, b, c)]) where</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&gt; </span><span style="font-family: courier new,monospace;">&nbsp; zip as bs cs = zipWith (\a (b,c) -&gt; (a,b,c)) as $ zip bs cs</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&gt; </span><span style="font-family: courier new,monospace;">instance Zip ([a] -&gt; [b] -&gt; [c] -&gt; [d] -&gt; [(a, b, c, d)]) where</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&gt; </span><span style="font-family: courier new,monospace;">&nbsp; zip as bs cs ds = zipWith (\a (b,c,d) -&gt; (a,b,c,d)) as $ zip bs cs ds</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&gt; </span><span style="font-family: courier new,monospace;">example = zip [1,2::Int] [&#39;a&#39;,&#39;b&#39;] [&quot;1&quot;,&quot;b&quot;] :: [(Int,Char,String)]</span><br style="font-family: courier new,monospace;">
<br>Regards,<br>Sean<br>