2009-11-18 6 views
6

Salut. Pour un tutoriel cette semaine, une des questions demande de créer une fonction formatLines en utilisant d'autres fonctions formatLine et formatList, pour formater une liste de lignes.New Line Haskell

Mon code ressemble à ceci;

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 

Le code semble (pour moi, au moins) comme il devrait fonctionner, mais au lieu de créer une nouvelle ligne où « \ n » est, \ n se joint en annexe à la chaîne.

Toute aide serait grandement appréciée. C'est parce que vous utilisez probablement print pour imprimer le résultat.

+2

'formatList = map' – Chuck

Répondre

21

Au lieu de cela, utilisez putStr. Observer:

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

Autre que cela, vous pouvez utiliser modèle correspondant à écrire formatList sans head et tail:

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

Mais il n'y a vraiment pas besoin de définir vous-même formatList, comme il est identique au fonction concatMap:

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

la combinaison de tout cela, vous pouvez al donc il suffit d'écrire (notez que (++ "\n") est un section):

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

... qui à son tour est équivalent à unlines:

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

unlines, pas unwords. Utiliser l'un ou l'autre n'est pas vraiment dans l'esprit de suivre un tutoriel, mais +1 pour indiquer ce qui est déjà disponible. – Nefrubyr

+0

@Nefrubyr: Doh, vous avez raison :) – Stephan202

0

Juste essayer

formatLines = unwords