【问题标题】:List comprehension in haskell, String -> [String], empty characters not being removedhaskell中的列表理解,字符串-> [字符串],未删除空字符
【发布时间】:2015-11-06 00:57:55
【问题描述】:

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

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"]

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

【问题讨论】:

    标签: list haskell list-comprehension


    【解决方案1】:

    对于您的直接问题:我将简单地指出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
    

    【讨论】:

    • 非常感谢,这个解释对我很有帮助。
    猜你喜欢
    • 2011-04-20
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2021-06-24
    相关资源
    最近更新 更多