Como ejercicio, escribí una breve función Haskell que devuelve los primeros cuatro caracteres de una cadena, concatenada. Tuve grandes problemas para convertir los caracteres en cadenas y recurrí a un feo replicate
hack. ¿Cuál es la mejor manera de mejorar esta función? (Supongo que tanto el patrón y la salida se pueden mejorar.)¿Cómo debería refactorizar este código Haskell para hacerlo más elegante?
concatFirstFour :: [Char] -> [Char]
concatFirstFour (a:b:c:d:_) = (replicate 1 a) ++ (replicate 1 b) ++ (replicate 1 c) ++ (replicate 1 d)
concatFirstFour xs = error "Need at least four characters."
Actualización: Muchas gracias, todo el mundo. Aprendí varias cosas de todas las respuestas y comentarios. Entiendo los tipos mucho mejor.
Aquí está el código que terminé usando:
initFirstFour :: [a] -> [a]
initFirstFour str
| length str > 3 = take 4 str
| otherwise = error "Need at least four characters."
Actualización 2: Cambiado el segundo patrón de XS a _ por el comentario de ptival. Lazy eval FTW.
Actualización 3: Limpiadores de guardias del comentario de tew88.
'concatFirstFour :: [a] -> [a]' es mejor – alternative
Tenga en cuenta que no necesita nombrar 'xs' en la última línea de su código, ya que el argumento nunca se usa en el cuerpo de la función. Puedes reemplazarlo con wilcard '_' – Ptival