Haskell:从字符串列表中删除空格

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Haskell:从字符串列表中删除空格相关的知识,希望对你有一定的参考价值。

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

继承人我所拥有的:

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

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

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

答案

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)上的模式匹配没有匹配[]是危险的,因为它会在空列表上失败。

另一答案

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

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

dropWhile isSpace

我们因此qazxsw poi以这样的方式所有字符在哪里qazxsw poi。

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

dropWhile
另一答案

关于如何从字符串中删除前导空格的问题,您可以通过简单地对字符串执行dropWhile来完成:

isSpace

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

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

import Data.Char(isSpace)

cutWhitespace = map (dropWhile isSpace)

你正在采取的过滤方法有点危险,因为即使你按照你认为应该做的那样,它也会删除所有空格,而不仅仅是前导空格。

以上是关于Haskell:从字符串列表中删除空格的主要内容,如果未能解决你的问题,请参考以下文章

用另一个列表替换主活动中的列表并从视图中删除旧列表

从list列表中以空格读取字符串 .java

文件处理-Haskell

如何从html源代码中删除空格

哈斯克尔。我很困惑这个代码片段是如何工作的

比较 C# 中的字符串片段并从集合中删除项目