I Creo que es probablemente la solución menos elegante sugerida, pero para completar, debería agregarse que tales cosas deberían ser posibles con Templa te Haskell.
Este fue en realidad están recogidas en lo que creo que es el documento original Plantilla Haskell (búsqueda zipn en el texto): http://research.microsoft.com/en-us/um/people/simonpj/Papers/meta-haskell/meta-haskell.pdf
pero creo que el código de hecho nunca trabajó, ver esto: http://www.haskell.org/pipermail/template-haskell/2003-July/000126.html (rebanadas de patrón no están implementadas).
Eso no fue implementado en 2003, pero todavía no está implementado hoy: http://www.haskell.org/ghc/docs/7.6.1/html/users_guide/template-haskell.html (rodajas de patrones no son compatibles)
Sin embargo, existe una implementación de zipWithN usando Haskell plantilla: http://www.haskell.org/haskellwiki/Template_Haskell#zipWithN
tengo verificó que funciona con este programa de prueba:
{-# 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
En el módulo Zipn, pegué la zipn, simplemente renombrado zipWithN para c laridad (y recuerde agregar el pragma TemplateHaskell en la parte superior). Tenga en cuenta que la N está, de hecho, grabada aquí dos veces, porque tuve que dar (,,)
como la función "con". Tendría que cambiar el número de comas según N.
(,,)
representa \a b c -> (a,b,c)
supongo que alguien con buena plantilla habilidades Haskell (que no es mi caso en este punto) podría hacer una zipN recta usando la plantilla Haskell.
Esta es la función zip3. –
Sí, 'zip3' es para comprimir 3 listas. –