【问题标题】:Stripping newlines in Haskell在 Haskell 中剥离换行符
【发布时间】:2011-03-23 08:19:36
【问题描述】:

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

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

string.rstrip(s[, chars])

返回删除了尾随字符的字符串副本。如果字符 被省略或无,空格 字符被删除。如果给出并且 不是 None,chars 必须是字符串;这 字符串中的字符将是 从字符串的末尾剥离 调用此方法。

【问题讨论】:

  • 虽然您的问题和给出的各种答案都涉及在 Haskell 中实现 Python 的 rstrip 函数,但在大多数情况下,在 Haskell 中使用它并不是很习惯。通常你会使用lineswords,除非有特殊原因。

标签: string list haskell


【解决方案1】:

这是一个简单的实现(改编自Wikipedia):

import Data.Char (isSpace)
rstrip = reverse . dropWhile isSpace . reverse

Data.String.Utils 中还已经定义了一个 rstrip

(顺便说一句,Hayoo! 是解决此类问题的绝佳资源:搜索 rstrip 可直接找到 Data.String.Utils。)

【讨论】:

  • 我以前从未查看过 Data.String.Utils。有用。 rstrip 看起来正是我们想要的。
【解决方案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"

【讨论】:

  • 这和特拉维斯的回答是一样的。
  • 是的,我猜我们是同时打字的。但我的做到了海报要求的!投票给我! :)
  • 我认为 trimnl = reverse。 dropwhile (elem "\n\r\t ") 。 reverse 会更接近 python 中的 rtrim
  • 万一有人关心,当我提交评论时,我对 elem 的调用丢失了它周围的反引号。
  • Tim:我不确定 SO escape 是什么(`testing` - 是的 \),但对于 Haskell,您至少可以使用翻转。 trimnl = reverse . dropWhile (flip elem "\n\r\t").
【解决方案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 --

【讨论】:

    【解决方案4】:

    取决于你的意思:

    Prelude> filter (/= '\n') "foo\n\nbar\n" “美食吧” Prelude> words "foo\n\nbar\n" [“富”,“酒吧”]

    但是这些不能很好地处理空间。所以也许不是你想要的。

    【讨论】:

    • 不过,这些都不是真正“剥离”字符串(在通常意义上的“删除前导或尾随字符”)。
    【解决方案5】:

    在现实世界的haskell 的第4 章中有一个示例,它可以执行您想要的拆分。完成后,您需要将这些部分重新粘贴在一起。 http://book.realworldhaskell.org/read/functional-programming.html

    在文本中搜索“热身:便携式分割文本行”。

    【讨论】:

      猜你喜欢
      • 2012-11-22
      • 2013-12-06
      • 2016-08-08
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      相关资源
      最近更新 更多