Haskell如何筛选字符串中包含大写字母的所有单词?
问题说明
输入参数a为String类型字符串,需求为查找出该字符串中所有包含大写字符的单词。实现功能时需要先将字符串拆分为单词组成的字符序列再做处理,当前给出的初始代码框架存在错误,无法正常运行:
listWordsWithUpper :: String -> [String] listWordsWithUpper a = filter (any . (isUpper a))
该函数的预期运行结果如下:
listWordsWithUpper "Haskell is tHe BEST" == ["Haskell", "tHe", "BEST"]
实现方案
首先需要引入依赖的字符判断函数:
import Data.Char (isUpper)
现有代码有两个核心问题:
- 没有把输入的整串按空格拆分成单词列表。Haskell内置的
words函数可以直接完成这个工作,它会把字符串按空白符分割,返回由每个单词组成的列表,而Haskell里String本身就是[Char]类型的字符序列,不需要额外做类型转换。 - 过滤谓词的写法类型错误。
isUpper的类型是Char -> Bool,作用是判断单个字符是否为大写,不需要传入整个字符串a作为参数;any isUpper作为filter的谓词时,会对每个传入的单词(本质是字符列表)做检查,只要单词里存在任意一个字符满足大写判断,就保留这个单词。
修正后可直接运行的完整代码:
import Data.Char (isUpper) listWordsWithUpper :: String -> [String] listWordsWithUpper a = filter (any isUpper) (words a)
直接运行测试用例即可得到预期结果,传入"Haskell is tHe BEST"时,会过滤掉全小写的单词"is",返回包含大写字符的三个单词组成的列表。
内容的提问来源于stack exchange,提问作者teki2021
相关产品推荐
相关产品推荐

