我正在尝试实现一个消除字符串空格的函数。如果谓词仅显式过滤空格,我不明白为什么此列表推导式会消除第一个字符。
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)
将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 转换。