列表理解正在删除第一个字符,为什么?

Eri*_*ans 0 haskell

我正在尝试实现一个消除字符串空格的函数。如果谓词仅显式过滤空格,我不明白为什么此列表推导式会消除第一个字符。

import Data.List
import System.IO

noSpace :: String -> String
noSpace (x:xs) = [x | x <- xs, x /= ' ']

main = do
  print(noSpace("8 j 8   mBliB8g  imjB8B8  jl  B"))
Run Code Online (Sandbox Code Playgroud)

结果:

"j8mBliB8gimjB8B8jlB"
Run Code Online (Sandbox Code Playgroud)

应该:

8j8mBliB8gimjB8B8jlB
Run Code Online (Sandbox Code Playgroud)

che*_*ner 5

x在你的模式是不相关的x在你的列表理解; 就像你写的

noSpace (x:xs) = [y | y <- xs, y /= ' ']
Run Code Online (Sandbox Code Playgroud)

请注意,x实际上已删除,因为列表理解不考虑它。

在这个定义中你不需要两者;列表推导式已经能够自己匹配列表中的每个字符,因此noSpace它本身不必进行任何模式匹配。

noSpace xs = [x | x <- xs, x /= ' ']
Run Code Online (Sandbox Code Playgroud)

这只是编写filter函数的另一种方式。

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

或者干脆

noSpace = filter (\x -> x /= ' ')
Run Code Online (Sandbox Code Playgroud)

或者更简单

noSpace = filter (/= ' ')
Run Code Online (Sandbox Code Playgroud)

两种简化都来自eta 转换