Ich denke, es ist wahrscheinlich die am wenigsten elegante Lösung, die vorgeschlagen wurde, aber der Vollständigkeit halber sollte hinzugefügt werden, dass solche Dinge mit Template Haskell möglich sein sollten.
Dies wurde in der Tat in dem, was ich denke, ist die ursprüngliche Template Haskell Papier (Suche zipn im Text) behandelt: http://research.microsoft.com/en-us/um/people/simonpj/Papers/meta-haskell/meta-haskell.pdf
Aber ich glaube, dieser Code hat nie wirklich funktioniert, siehe dies: http://www.haskell.org/pipermail/template-haskell/2003-July/000126.html (Pattern Slices sind nicht implementiert).
Das war 2003 nicht der Fall, aber es ist auch heute noch nicht umgesetzt: http://www.haskell.org/ghc/docs/7.6.1/html/users_guide/template-haskell.html (Pattern Slices werden nicht unterstützt)
Es gibt jedoch eine Implementierung von zipWithN unter Verwendung von Template Haskell: http://www.haskell.org/haskellwiki/Template_Haskell#zipWithN
Ich habe überprüft, dass es mit diesem Testprogramm funktioniert:
{-# LANGUAGE TemplateHaskell #-}
import Zipn
main = do
let l1 = [1,2,3]
let l2 = [5,6,7]
let l3 = [7,4,8]
print $ $(zipWithN 3) (,,) l1 l2 l3
In das Zipn-Modul habe ich das zipn eingefügt, nur der Übersichtlichkeit halber in zipWithN umbenannt (und daran gedacht, das Pragma TemplateHaskell oben hinzuzufügen). Beachten Sie, dass das N hier tatsächlich zweimal harcodiert ist, weil ich (,,)
als die Funktion "mit". Sie müssen die Anzahl der Kommas je nach N ändern.
(,,)
steht für \a b c -> (a,b,c)
Ich schätze, dass jemand mit guten Template-Haskell-Kenntnissen (was bei mir derzeit nicht der Fall ist) ein geradliniges zipN mit Template Haskell erstellen könnte.