2009-11-18 11 views
6

Hey. Para un tutorial de esta semana, una de las preguntas solicita crear una función formatLines mediante el uso de otras funciones formatLine y FormatList, para formatear una lista de líneas.New Line Haskell

Mi código es así;

type Line = String 

formatLine :: Line -> String 
formatLine l = l ++ "\n" 

formatList :: (a -> String) -> [a] -> String 
formatList f [] = [] 
formatList f xs = f (head xs) ++ formatList f (tail xs) 

formatLines :: [Line] -> String 
formatLines xs = formatList formatLine xs 

El código parece (a mí, al menos) que debería funcionar, pero en lugar de crear una nueva línea donde "\ n" es, \ n se añade a la cadena.

Cualquier ayuda sería muy apreciada.

+2

'FormatList = map' – Chuck

Respuesta

21

Esto se debe a que probablemente esté usando print para imprimir el resultado. En su lugar, use putStr. Observe:

Prelude> print "test\ntest\n" 
"test\ntest" 
Prelude> putStr "test\ntest\n" 
test 
test 

Aparte de eso, puede utilizar coincidencia de patrones para escribir formatList sin head y tail:

formatList :: (a -> String) -> [a] -> String 
formatList f [] = [] 
formatList f (x:xs) = f x ++ formatList f xs 

Pero en realidad no hay necesidad de definir formatList a sí mismo, ya que es idéntica a la concatMap función:

formatList :: (a -> String) -> [a] -> String 
formatList = concatMap 

Combinando todo esto, se puede col por lo que acaba de escribir (tenga en cuenta que es una (++ "\n")section):

formatLines :: [String] -> String 
formatLines = concatMap (++ "\n") 

... que a su vez es equivalente a unlines:

formatLines :: [String] -> String 
formatLines = unlines 
+0

revela, no hay palabras. El uso de cualquiera de los dos no es realmente el espíritu de seguir un tutorial, pero +1 para señalar lo que ya está disponible. – Nefrubyr

+0

@Nefrubyr: doh, tienes razón :) – Stephan202

0

sólo trato

formatLines = unwords