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

时间:2015-11-06 00:57:55

标签: list haskell list-comprehension

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

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

我收到的输出,例如:

  

getCharList&#34;为什么没有这项工作&#34;

是:

  

[&#34; W&#34;&#34; H&#34;&#34; Y&#34;&#34;&#34;&#34; d&#34;,& #34; O&#34;&#34; E&#34;&#34; S&#34;&#34; N&#34;&#34;&#34;&#34; T&# 34;,&#34;&#34;&#34; T&#34;&#34; H&#34;&#34; I&#34;&#34; S&#34;&# 34;&#34;&#34; W&#34;&#34; O&#34;&#34; R&#34;&#34; K&#34;]

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

1 个答案:

答案 0 :(得分:2)

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

弹出一个关卡,我发现你现有的代码有些奇怪。您应该意识到的主要事情是String [Char]完全相同的类型(它只是它的另一个名称)。没有必要进行任何处理以将String转换为其元素列表 - splitOn ""基本上是不需要的工作。文字"foo"只是文字['f', 'o', 'o']的简写(在ghci中尝试它们!)。因此,我建议完全重写您的功能,大致如下:

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

(我在返回类型中使用了[Char]而不是String来强调我打算将返回的东西视为字母列表而不是合理的字符串。这是一个人类 - 仅限级别差异; GHC同样乐意将返回值称为String。)这完全是惯用的。如果您愿意,也可以包括参数,改为编写:

getLetters s = filter isLetter s