Tengo que escribir una función que aplana una lista de listas.Aplanar una lista de listas
Por ejemplo flatten [] = []
o flatten [1,2,3,4] = [1,2,3,4]
o flatten [[1,2],[3],4,5]] = [1,2,3,4,5]
Tengo problemas con el poder para que coincida con el tipo en función de lo que se da a la función aplanar.
Esto es lo que tengo:
data A a = B a | C [a] deriving (Show, Eq, Ord)
flatten::(Show a, Eq a, Ord a)=>A a -> A a
flatten (C []) = (C [])
flatten (C (x:xs)) = (C flatten x) ++ (C flatten xs)
flatten (B a) = (C [a])
De lo que puedo decir la cuestión es que el operador ++
está a la espera de una lista de sus dos argumentos y estoy tratando de darle algo de tipo A
. Agregué el tipo A
para que la función pueda obtener un solo elemento o una lista de elementos.
¿Alguien conoce una manera diferente de hacer esto de manera diferente, o explica qué puedo hacer para corregir el error de tipo?
No estoy seguro de qué es exactamente lo que desea. Tal vez 'aplastar :: A [a] -> A a; aplanar (B xs) = C xs; aplanar (C xss) = C (concat xss) '¿te ayudaría?Básicamente, no puede escribir aplanar para que tome listas de diferentes anidamientos y haga cosas diferentes con ellos, a menos que los ajuste a un nuevo tipo y distinga los casos por constructor. –
El tipo de su función debe ser '[[a]] -> [a]'. Esto significa que 'flatten []' es válido, y 'flatten [[1,2,3,4]]' es válido, pero 'flatten [1,2,3,4]' no lo es. '[1,2,3,4]' no es una lista de listas. Si piensas en eso y comienzas desde el principio, eliminando tu tipo especial, lo encontrarás mucho más fácil. –
posible duplicado de [operación en la lista de listas | cómo] (http://stackoverflow.com/questions/9477806/operation-on-list-of-lists-how) – rampion