Haskell-删除非字母字符但忽略空格?

Haskell-删除非字母字符但忽略空格?,haskell,Haskell,我对哈斯克尔很陌生。我试图从给定字符串(可能包含非字母字符)返回一个字符串列表,但列表中只有一个字符串 下面的代码显示了我到目前为止所做的尝试: toLowerStr xs = map toLower xs --drop non-letters characters dropNonLetters xs = words $ (filter (\x -> x `elem` ['a'..'z'])) $ toLowerStr xs 使用toLower函数将所有字符小写 使用filter功能

我对哈斯克尔很陌生。我试图从给定字符串(可能包含非字母字符)返回一个字符串列表,但列表中只有一个字符串

下面的代码显示了我到目前为止所做的尝试:

toLowerStr xs = map toLower xs

--drop non-letters characters
dropNonLetters xs = words $ (filter (\x -> x `elem` ['a'..'z'])) $ toLowerStr xs
  • 使用
    toLower
    函数将所有字符小写
  • 使用
    filter
    功能删除非字母字符
  • 使用
    words
    函数返回字符串列表
我认为
filter
函数正在删除空格,因此它变成了一个字符串。我试着使用
isSpace
函数,但我不知道在这种情况下如何实现它

我做错了什么?我得到这个输出:

λ> dropNonLetters "ORANGE, apple! APPLE!!"
["orangeappleapple"]
但我希望实现以下输出:

λ> dropNonLetters "ORANGE, apple! APPLE!!"
["orange","apple","apple"]
我认为filter函数删除了空格,因此它变成了一个字符串

这是正确的。作为筛选谓词,您可以编写
\x->x`elem`['a'..'z']
['a'..'z']
是一个包含小写字母的列表,因此对于空格,谓词将失败,因此您也应该允许空格

例如,我们可以将空格字符添加到列表中:

dropNonLetters xs = words $ (filter (\x -> x `elem` (' ':['a'..'z'])))) $ toLowerStr xs
isLower
isSpace
不仅更具“描述性”和优雅。通常,这些函数将比成员资格检查(通常在O(n)中完成)更快,而且它还将考虑选项卡、新行等

我们还可以对功能执行eta降低:

dropNonLetters = words . (filter (\x -> isLower x || isSpace x)) . toLowerStr

我建议您重命名函数
dropNonLetters
,因为现在它没有完全解释它将生成一个单词列表。基于名称,我认为它只删除非字母,而不是将字符串转换为小写,也不是构造单词。

下面是一个将字符分隔为单独字符串列表的示例:

排序编号::[Char]->[String] sortNumbers args=filter(\strings->strings/=“”)$zipWith(\x numbers->filter(\char->char==numbers)x)(重复args) ['1'..'9']


对于制表符,…@WillemVanOnsem单词之间的空格非常感谢您的工作,我将重命名该函数。代码的第二个块中缺少
->
dropNonLetters = words . (filter (\x -> isLower x || isSpace x)) . toLowerStr
Prelude Data.Char> dropNonLetters "ORANGE, apple! APPLE!!"
["orange","apple","apple"]