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