Haskell实现hugeHDDs函数筛选大容量HDD的技术问题
Haskell 筛选大容量HDD函数实现方案
问题背景
给定Haskell数据类型定义:
data Storage = HDD String Int Int | SSD String Int deriving (Eq, Show)
其中:
HDD对应参数为厂商、转速、容量SSD对应参数为厂商、容量
需实现函数 hugeHDDs :: [Storage] -> [Storage],满足:
- 筛选出容量大于所有SSD最大容量的HDD
- 若列表中无SSD,则返回所有HDD
用户尝试的代码如下,但无法正常运行:
maxSSD :: [Int] -> Int maxSSD = foldr f 0 where f a (cap (SSD c b)) = max a (cap (SSD c b)) cap :: Storage -> Int cap (SSD _ b) = b
现有代码问题分析
cap函数不完整:仅处理了SSD构造器,遇到HDD时会触发模式匹配错误maxSSD类型与逻辑混乱:函数声明为[Int] -> Int,但实际需要处理[Storage]列表;折叠函数参数类型不匹配,且未先过滤出SSD就直接处理整个列表- 边界情况未处理:没有考虑无SSD的场景
正确实现方案
步骤1:完善容量提取函数
先实现能提取任意Storage容量的函数:
cap :: Storage -> Int cap (HDD _ _ c) = c -- HDD的第三个参数是容量 cap (SSD _ c) = c -- SSD的第二个参数是容量
步骤2:获取SSD的最大容量
通过过滤+提取容量的方式,用Maybe Int处理无SSD的情况:
maxSSDCap :: [Storage] -> Maybe Int maxSSDCap storages = case map cap (filter isSSD storages) of [] -> Nothing -- 无SSD时返回Nothing caps -> Just (maximum caps) where isSSD :: Storage -> Bool isSSD (SSD _ _) = True isSSD _ = False
步骤3:实现目标函数hugeHDDs
根据是否存在SSD的结果,筛选符合条件的HDD:
hugeHDDs :: [Storage] -> [Storage] hugeHDDs storages = let allHDDs = filter isHDD storages maxSSD = maxSSDCap storages isHDD :: Storage -> Bool isHDD (HDD _ _ _) = True isHDD _ = False in case maxSSD of Nothing -> allHDDs -- 无SSD时返回所有HDD Just maxCap -> filter (\hdd -> cap hdd > maxCap) allHDDs
简化版实现
也可以用列表推导式简化逻辑,用-1作为无SSD时的阈值(假设容量均为正整数):
hugeHDDs :: [Storage] -> [Storage] hugeHDDs xs = let ssdCaps = [cap s | s <- xs, isSSD s] maxCap = if null ssdCaps then -1 else maximum ssdCaps isSSD (SSD _ _) = True isSSD _ = False isHDD (HDD _ _ _) = True isHDD _ = False in filter (\h -> isHDD h && cap h > maxCap) xs
内容的提问来源于stack exchange,提问作者Tamás Veszelyi
相关产品推荐
相关产品推荐

