嘿。本周的一个教程,其中一个问题要求通过使用其他函数 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
我是一名优秀的程序员,十分优秀!