2009-11-18 16 views
6

Hej. Na potrzeby tutoriala w tym tygodniu jedno z pytań prosi o utworzenie funkcji formatLines przy użyciu innych funkcji: formatLine i formatList, aby sformatować listę linii.Nowa linia Haskell

Mój kod wygląda następująco;

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 

Kod wydaje się (dla mnie przynajmniej) jak to powinno działać, ale zamiast tworzyć nową linię, gdzie „\ n” jest \ n zostanie dołączona do łańcucha.

Każda pomoc zostanie bardzo doceniona.

+2

'formatList = map' – Chuck

Odpowiedz

21

To dlatego, że prawdopodobnie używasz print, aby wydrukować wynik. Zamiast tego użyj putStr. Przestrzegać:

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

Poza tym, można użyć wzorca dopasowania napisać formatList bez head i tail:

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

Ale faktycznie nie ma potrzeby definiowania formatList siebie, jak to jest identyczna z funkcja concatMap:

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

Łącząc to wszystko, możesz tak po prostu napisać (zauważ, że (++ "\n") jest section):

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

... który z kolei jest równoznaczne z unlines:

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

unlines, a nie unwords. Korzystanie z nich nie jest zgodne z samouczkiem, a +1 za wskazanie tego, co jest już dostępne. – Nefrubyr

+0

@Nefrubyr: doh, masz rację :) – Stephan202

0

Spróbuj

formatLines = unwords