在Haskell中从字符串中删除换行符的惯用方法是什么(或者有没有)?或者我是否必须通过查找尾随的换行符/空格然后删除它们来制作自己的?
编辑:我正在寻找Python的rstrip所做的事情,但不需要可选的“chars”参数:string.rstrip(s [,chars])
返回删除了尾随字符的字符串副本。如果是chars 省略或无,空白 字符被删除。如果给予和 不是没有,字符必须是一个字符串;该 字符串中的字符将是 从字符串的末尾剥离 调用此方法。
答案 0 :(得分:10)
这是一个简单的实现(改编自Wikipedia):
import Data.Char (isSpace)
rstrip = reverse . dropWhile isSpace . reverse
Data.String.Utils
中已经定义了rstrip
。
(顺便说一下,Hayoo!是解决此类问题的绝佳资源:搜索rstrip
会将您直接带到Data.String.Utils
。)
答案 1 :(得分:3)
取决于您的意思:
Prelude> filter (/= '\n') "foo\n\nbar\n" "foobar" Prelude> words "foo\n\nbar\n" ["foo","bar"]
但这些并不能很好地处理空间。所以也许不是你想要的。
答案 2 :(得分:3)
如果这是针对典型的文件读取应用程序,那么您应该从lines
开始。这可以让您完全避免Data.String.Utils.rstrip
:
> lines "one time\na moose\nbit my sister\n"
["one time", "a moose", "bit my sister"]
如您所见,lines
获取整个文件的文本,并将每行正确地转换为不带尾随换行符的字符串。这意味着您可以编写如下程序:
main = mapM_ (putStrLn . process) . lines =<< readFile "foo.txt"
where process :: String -> String
process = -- your code here --
答案 3 :(得分:2)
我前几天用过这个:
Prelude> let trimnl = reverse . dropWhile (=='\n') . reverse
Prelude> trimnl ""
""
Prelude> trimnl "\n"
""
Prelude> trimnl "a\n"
"a"
Prelude> trimnl "a\n\n"
"a"
Prelude> trimnl "a\nb\n"
"a\nb"
答案 4 :(得分:1)
现实世界haskell的第4章中有一个样本可以完成你想要的分裂。完成后,您需要将这些碎片粘贴在一起。 http://book.realworldhaskell.org/read/functional-programming.html
在文本中搜索“预热:可移植地分割文本行”。