2015-11-06 89 views
0

我想分割字符串中的字符串,并删除过程中的任何非字母。这是我到目前为止的代码:haskell中的列表理解,字符串 - > [字符串],空字符不被删除

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

我从收到的输出,例如:

getCharList “为什么不这项工作”

是:

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

有人能解释为什么这似乎不能删除空白字符?

回答

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将同样高兴地将返回值称为a String。)这完全是惯用的。如果你愿意,你也可以包括论点,写作,而不是:

getLetters s = filter isLetter s 
+0

非常感谢,解释真的帮助了我。 – user5525615