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

Alo*_*ous 4 string haskell list filter

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

继承人我所拥有的:

cutWhitespace (x:xs) = filter (\xs -> (xs /=' ')) x:xs
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ann 5

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

cutWhitespace (x:xs) = (filter (\xs -> (xs /=' ')) x) : xs
Run Code Online (Sandbox Code Playgroud)

在这里,我将括号放在身体的大部分周围,以明确它的评估方式.在filter仅适用于x,并且x是输入列表的第一个元素; 在示例输入中" x".

如果您" x"按给定过滤,您会得到"x":

Prelude> filter (\xs -> (xs /=' ')) " x"
"x"
Run Code Online (Sandbox Code Playgroud)

cutWhitespace然后,最后一件事是采取list([" y", " z"])的其余部分并将其收纳"x",以便它返回["x"," y"," z"].

为了解决这个问题,你可以编写函数,并认识到字符串列表是一个嵌套的字符列表,即[[Char]].

作为一个警告,(x:xs)没有匹配的模式匹配[]是危险的,因为它将在空列表上失败.