Новая Линия Хаскелл - PullRequest
       4

Новая Линия Хаскелл

6 голосов
/ 18 ноября 2009

Эй. В учебном пособии на этой неделе один из вопросов просит создать функцию formatLines с помощью других функций formatLine и formatList для форматирования списка строк.

Мой код выглядит так:

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

Код кажется (по крайней мере мне), что он должен работать, но вместо создания новой строки, где "n", \ n добавляется к строке.

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

Ответы [ 2 ]

21 голосов
/ 18 ноября 2009

Это потому, что вы, вероятно, используете 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") - это секция ):

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

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

formatLines :: [String] -> String
formatLines = unlines
0 голосов
/ 18 ноября 2009

Просто попробуйте

formatLines = unwords
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...