haskell 中的列表理解,字符串 -> [字符串],未删除空字符

List comprehension in haskell, String -> [String], empty characters not being removed

我正在尝试将一个字符串拆分为一个字符列表,并在此过程中删除所有非字母。到目前为止,这是我的代码:

getCharList :: String -> [String] 
getCharList x = [filter isLetter c | c <- splitOn "" x, c /= ""]

我收到的输出,例如:

getCharList "Why doesn't this work"

是:

["W","h","y","","d","o","e","s","n","","t","","t","h","i","s","","w","o","r","k"]

有人可以解释一下为什么这似乎无法删除空字符吗?

对于您的直接问题:即使 c 不是空列表,我也会简单地指出 filter isLetter c 可能是空列表;因此 c /= "" 不能确保 filter isLetter c /= "".

弹出一个级别,我发现您现有的代码有一些奇怪之处。您应该意识到的主要事情是 String [Char] 完全相同的类型(它只是它的另一个名称)。无需进行任何处理即可将 String 转换为其元素列表——splitOn "" 基本上是不需要的工作。文字 "foo" 只是文字 ['f', 'o', 'o'] 的 shorthand(在 ghci 中尝试它们!)。因此,我建议按照以下几行完全重写您的函数:

getLetters :: String -> [Char]
getLetters = filter isLetter

(我在 return 类型中使用 [Char] 而不是 String 来强调我打算将 returned 的东西视为字母列表而不是而不是合理的字符串。这只是人类层面的差异;GHC 很乐意将 returned 值称为 String。)这是完全惯用的。如果您愿意,还可以包括参数,改为:

getLetters s = filter isLetter s