【问题标题】:Haskell: Deleting white space from a list of stringsHaskell:从字符串列表中删除空格
【发布时间】:2018-08-10 06:35:08
【问题描述】:

问题是:编写一个删除前导白色的函数 字符串中的空格。示例:cutWhitespace [" x","y"," z"] 预期答案:["x","y","z"]

这是我所拥有的:

cutWhitespace (x:xs) = filter (\xs -> (xs /=' ')) x:xs

当输入为[" x"," y", " z"] 时,这将返回["x", " y"," z"]。为什么它忽略了第二个和第三个字符串中的空格,我该如何解决?

我们可以使用高阶函数,这就是我实现过滤器的原因。

【问题讨论】:

  • 您的函数是仅从字符串中删除前导空格,还是从字符串数组中删除前导空格?如果是后者,你可以做一个地图 (dropWhile (\c -> c == ' '))
  • 您是否只将空格 ' ' 视为空格?选项卡、新行等呢?通常正则表达式将空格视为空格、换行符、制表符、回车、垂直制表符和换页。
  • 您询问有关从单个字符串中删除前导空格的问题,但您的示例让您从字符串列表中删除前导空格。你想做什么?

标签: string list haskell filter


【解决方案1】:

您提出的关于如何从字符串中删除前导空格的问题,您只需对字符串执行 dropWhile 即可:

deleteLeadingWhitespace = dropWhile (\c -> c == ' ')

尽管如果您考虑其他事物“空白”,您应该更聪明。例如,您可以使用 Data.Char 中定义的“isSpace”函数。

从您的示例数据来看,您似乎确实在尝试对字符串列表执行此操作,在这种情况下,您可以将 dropWhile 映射到您的数组:

map deleteLeadingWhitespace

您采用的过滤方法有点危险,因为即使您让它按照您认为的方式进行操作,它也会删除所有空格,而不仅仅是前导空格。

【讨论】:

  • 第二个例子不应该是map deleteLeadingWhitespace吗?
  • 绝对应该。固定!
【解决方案2】:

我建议使用isSpace :: Char -> Bool,而不是编写一个检查字符是否为空格的自定义函数。此函数不仅为空格 (' ') 返回 True,还为换行 ('\n')、回车 ('\r')、制表符 ('\t')、垂直制表符 ( '\v') 和换页 ('\f') 也是如此。通常最好使用这些函数,因为忘记某些情况的几率更低。

因此,我们可以删除单个字符串的间距:

dropWhile isSpace

我们因此dropWhile 以这样的方式在isSpace 所在的所有字符。

然后我们可以使用此过滤器执行映射以过滤所有字符串中的空格,例如:

import Data.Char(isSpace)

cutWhitespace = map (dropWhile isSpace)

【讨论】:

    【解决方案3】:

    OP cutWhitespace 函数只对第一个字符串起作用的原因是,由于运算符优先级,它实际上是这个函数:

    cutWhitespace (x:xs) = (filter (\xs -> (xs /=' ')) x) : xs
    

    在这里,我在主体的大部分区域都放置了括号,以明确其评估方式。 filter 只应用于xx 是输入列表的第一个元素;在示例中输入" x"

    如果你过滤" x",你会得到"x"

    Prelude> filter (\xs -> (xs /=' ')) " x"
    "x"
    

    然后,cutWhitespace 所做的最后一件事是获取列表的其余部分 ([" y", " z"]) 并将其用于 "x",以便它返回 ["x"," y"," z"]

    为了解决这个问题,您可以编写函数,实现字符串列表是嵌套的字符列表,即[[Char]]

    作为警告,(x:xs) 上的模式匹配而不匹配 [] 是危险的,因为它会在空列表上失败。

    【讨论】:

    • Drop while 是做到这一点的最佳方式,但使用过滤器这样做很痛苦,而且肯定比使用 dropWhile 更困难。感谢您的帮助,您的解释很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 2017-11-20
    相关资源
    最近更新 更多