Haskell中判断一个列表包含另一个列表所有元素的惯用方法是什么?
Haskell 检查列表是否包含全部26个英文字母的简洁方案
基础实现(无需额外依赖)
直接使用高阶函数all简化批量判断逻辑,无需手动编写26次elem调用:
import Data.Char (toLower) -- 检查输入字符串是否包含全部26个小写英文字母(自动兼容大写输入) hasAllAlphabets :: String -> Bool hasAllAlphabets input = all (`elem` map toLower input) ['a'..'z']
代码逻辑说明:
['a'..'z']自动生成包含全部26个小写字母的列表,无需手动枚举all函数会逐个验证每个字母是否存在于输入列表中,自动对所有判断结果做与运算map toLower input将输入统一转为小写,兼容大小写混合的输入场景,不需要的话可以移除
通用封装(支持任意元素类型的全包含判断)
如果需要复用“判断列表A是否包含列表B所有元素”的逻辑,可以封装为通用函数:
containsAll :: Eq a => [a] -> [a] -> Bool containsAll sourceList targetList = all (`elem` sourceList) targetList
调用示例:containsAll 你的输入列表 ['a'..'z']
高性能版本(适合长输入场景)
如果输入列表很长,使用Set优化查找效率,复杂度从O(n*m)降低到O((n+m)log n):
import qualified Data.Set as Set import Data.Char (toLower) hasAllAlphabetsFast :: String -> Bool hasAllAlphabetsFast input = charSet `Set.isSupersetOf` alphabetSet where charSet = Set.fromList $ map toLower input alphabetSet = Set.fromList ['a'..'z']
内容的提问来源于stack exchange,提问作者Louis Cloete
相关产品推荐
相关产品推荐

