我正在尝试将字符串拆分为字符列表并删除过程中的任何非字母。到目前为止,这是我的代码:
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;]
有人可以解释为什么这似乎无法删除空字符吗?
答案 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