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