2009-11-18 2 views
6

Эй. Для учебника на этой неделе в одном из вопросов предлагается создать функцию formatLines, используя другие функции formatLine и formatList, для форматирования списка строк.New Line Haskell

Мой код выглядит следующим образом;

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 

код кажется (мне, по крайней мере), как это должно работать, но вместо того, чтобы создать новую строку, где «\ п» есть, \ п добавляемый к строке.

Любая помощь была бы принята с благодарностью.

+2

'formatList = map' – Chuck

ответ

21

Это потому, что вы, вероятно, используете print, чтобы распечатать результат. Вместо этого используйте putStr. Обратите внимание:

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

Кроме этого, вы можете использовать шаблон соответствия писать formatList без head и tail:

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

Но на самом деле нет необходимости определять formatList себя, так как он идентичен функция concatMap:

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

Объединяя все это, вы можете аль так что просто написать (обратите внимание, что (++ "\n") является section):

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

... в свою очередь, эквивалентно unlines:

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

unlines, а не unwords. Использование либо на самом деле не соответствует духу руководства, а +1 для указания того, что уже доступно. – Nefrubyr

+0

@Nefrubyr: да, ты прав :) – Stephan202