2012-03-13 38 views
5

Quiero una función que tome dos listas de cualquier tipo y devuelva una (es decir, f:: [[a]] -> [[a]] -> [[a]]). Básicamente, también produce la 'concatenación' de las dos listas de entrada.Concatenación de listas en Haskell

p. Ej.

> f [[1,2,3], [123]] [[4,5,6], [3,7]] 
[[1,2,3,4,5,6], [1,2,3,3,7], [123,4,5,6], [123,3,7]] 

Actualmente he llegado hasta aquí con él:

f _ [] = [] 
f [] _ = [] 
f (xs:xss) (ys:yss) = ((xs ++ ys) : [m | m <- f [xs] yss]) 

Pero esto no tiene en cuenta xss y que está mal. ¿Alguna sugerencia?

Respuesta

9

Es un producto cartesiano, por lo que puede simplemente usar una lista de comprensión para hacer todo.

Prelude> let xs = [[1,2,3], [123]] 
Prelude> let ys = [[4,5,6], [3,7]] 
Prelude> [x ++ y | x <- xs, y <- ys] 
[[1,2,3,4,5,6],[1,2,3,3,7],[123,4,5,6],[123,3,7]] 
3
import Control.Applicative 

(++) <$> [[1,2,3], [123]] <*> [[4,5,6], [3,7]] 
[[1,2,3,4,5,6],[1,2,3,3,7],[123,4,5,6],[123,3,7]] 
+10

o simplemente 'liftA2 (++)' – luqui

3
f l1 l2 = [x ++ y | x <- l1, y <- l2] 
+0

¡¿Cómo me he perdido esto ?! Pateando yo mismo. ¡Cosas básicas básicas! –

2

En Alternative:

import Control.Applicative 

f :: (Applicative f, Alternative g) => f (g a) -> f (g a) -> f (g a) 
f = liftA2 (<|>) 
1
f a b = map concat . sequence $ [a,b] 

escala hasta para combinar cualquier número de listas.

Cuestiones relacionadas