tuplas - función haskell que recupera la cabeza de una lista
¿Hay alguna función de haskell para concatenar la lista con el separador? (4)
¿Hay una función para concatenar elementos de una lista con un separador? Por ejemplo:
> foobar " " ["is","there","such","a","function","?"]
["is there such a function ?"]
Gracias por cualquier respuesta!
No es difícil escribir una línea usando foldr
join sep xs = foldr (/a b-> a ++ if b=="" then b else sep ++ b) "" xs
join " " ["is","there","such","a","function","?"]
Sí, hay :
Prelude> import Data.List
Prelude Data.List> intercalate " " ["is","there","such","a","function","?"]
"is there such a function ?"
intersperse
es un poco más general:
Prelude> import Data.List
Prelude Data.List> concat (intersperse " " ["is","there","such","a","function","?"])
"is there such a function ?"
Además, para el caso específico en el que desea unirse con un carácter de espacio, hay unwords
:
Prelude> unwords ["is","there","such","a","function","?"]
"is there such a function ?"
unwords funciona de forma similar, solo que las cadenas se implosionan con el carácter de nueva línea y que también se agrega un carácter de nueva línea al final. (Esto hace que sea útil para serializar archivos de texto, que deben ser por fin de estándar POSIX con una línea nueva posterior)
Si desea escribir sus propias versiones de intercalate
e intersperse
:
intercalate :: [a] -> [[a]] -> [a]
intercalate s [] = []
intercalate s [x] = x
intercalate s (x:xs) = x ++ s ++ (intercalate s xs)
intersperse :: a -> [a] -> [a]
intersperse s [] = []
intersperse s [x] = [x]
intersperse s (x:xs) = x : s : (intersperse s xs)
joinBy sep cont = drop (length sep) $ concat $ map (/w -> sep ++ w) cont