You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

现有代码问题分析

  1. cap 函数不完整:仅处理了SSD构造器,遇到HDD时会触发模式匹配错误
  2. maxSSD 类型与逻辑混乱:函数声明为[Int] -> Int,但实际需要处理[Storage]列表;折叠函数参数类型不匹配,且未先过滤出SSD就直接处理整个列表
  3. 边界情况未处理:没有考虑无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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:20:35