嘿。对于本周的教程,一个问题要求使用其他函数formatLine和formatList创建函数formatLines,以格式化行列表。
我的代码看起来像这样;
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后面创建新行,而是将其附加到字符串中。
任何帮助将不胜感激。
最佳答案
那是因为您可能正在使用 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