String 在Haskell中剥离换行符

String 在Haskell中剥离换行符,string,list,haskell,String,List,Haskell,在Haskell中,从字符串中去掉换行符的惯用方法是什么(或者有什么)呢?或者,我必须通过查找尾随的换行符/空格,然后删除它们来创建自己的换行符/空格吗 编辑:我正在寻找Python的rstrip的功能,但不需要可选的“chars”参数: string.rstrip(s[,chars]) 返回已删除尾随字符的字符串副本。如果查 如果省略或无,则为空白 字符将被删除。如给予及 不是无,字符必须是字符串;这个 字符串中的字符将被删除 从绳子的末端剥去 在上调用此方法 根据您的意思: Prelude>

在Haskell中,从字符串中去掉换行符的惯用方法是什么(或者有什么)呢?或者,我必须通过查找尾随的换行符/空格,然后删除它们来创建自己的换行符/空格吗

编辑:我正在寻找Python的rstrip的功能,但不需要可选的“chars”参数:

string.rstrip(s[,chars])

返回已删除尾随字符的字符串副本。如果查 如果省略或无,则为空白 字符将被删除。如给予及 不是无,字符必须是字符串;这个 字符串中的字符将被删除 从绳子的末端剥去 在上调用此方法


根据您的意思:

Prelude> filter (/= '\n') "foo\n\nbar\n" "foobar" Prelude> words "foo\n\nbar\n" ["foo","bar"] 前奏曲>过滤器(/='\n')“foo\n\nbar\n” “foobar” 前奏曲>单词“foo\n\nbar\n” [“foo”,“bar”]
但是这些不能很好地处理空间。因此,可能不是您想要的。

这里有一个简单的实现(改编自):

中还定义了一个
rstrip


(顺便说一句,对于这类问题来说,这是一个很好的资源:搜索将直接带您到
Data.String.Utils

在真实世界的haskell第4章中有一个示例,它可以进行您想要的拆分。完成后,您需要将各部分重新粘贴在一起。


在文本中搜索“预热:可移动拆分文本行”。

前几天我用过这个:

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"

如果这是一个典型的文件读取应用程序,那么您可能应该从
行开始。这可以让您完全避免
Data.String.Utils.rstrip

> lines "one time\na moose\nbit my sister\n"
["one time", "a moose", "bit my sister"]
如您所见,
获取整个文件的文本,并正确地将每一行转换为一个没有尾随换行符的字符串。这意味着您可以编写如下程序:

main = mapM_ (putStrLn . process) . lines =<< readFile "foo.txt"
  where process :: String -> String
        process = -- your code here --
main=mapM(putStrLn.process)。行=字符串
process=--这里是您的代码--

不过,这两种方法实际上都没有“去除”字符串(通常意义上的“删除前导或尾随字符”)。这与Travis的回答原理相同。是的,我想我们是在同一时间输入的。但我的就照海报上说的做了!投我一票!:)我认为trimnl=相反。dropwhile(
elem
“\n\r\t”)。在pythonIn中,reverse会更接近rtrim,以防有人在意,我给elem的电话在我提交评论时失去了回音。蒂姆:我不确定escape是什么意思(`testing`-yep it's\),但对于Haskell,你至少可以使用flip<代码>trimnl=反向。dropWhile(flip elem“\n\r\t”)
。我以前从未查看过Data.String.Utils。有用。而rstrip看起来正是我们想要的。虽然您的问题和给出的各种答案都涉及在Haskell中实现Python的
rstrip
函数,但在大多数情况下,在Haskell中使用它并不是很习惯。通常您会使用
,除非另有特殊原因。
main = mapM_ (putStrLn . process) . lines =<< readFile "foo.txt"
  where process :: String -> String
        process = -- your code here --