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

Haskell类型解构问题:如何筛选非0参数的Days类型元素

解决Haskell Days类型解构与筛选问题

你定义的Days是一个代数数据类型,每个构造器都携带一个Int参数。要解构这类类型,模式匹配是Haskell里最直接的方式——通过匹配每个构造器的形式,就能提取出里面的数值。

方法一:先写辅助函数提取数值,再筛选

先定义一个辅助函数,用来从任意Days值中取出对应的整数:

getDayNum :: Days -> Int
getDayNum (Mon n) = n
getDayNum (Tue n) = n
getDayNum (Wed n) = n
getDayNum (Thu n) = n
getDayNum (Fri n) = n

这个函数通过模式匹配,把每个构造器里的Int绑定到变量n,直接返回它。

接下来就可以用Haskell内置的filter函数,结合这个辅助函数筛选出数值不为0的元素:

filterNonZeroDays :: [Days] -> [Days]
filterNonZeroDays = filter (\day -> getDayNum day /= 0)

方法二:直接在筛选谓词里模式匹配

如果不想单独写辅助函数,也可以把模式匹配直接放到filter的判断逻辑里,用case表达式实现:

filterNonZeroDays :: [Days] -> [Days]
filterNonZeroDays = filter (\day -> case day of
    Mon n -> n /= 0
    Tue n -> n /= 0
    Wed n -> n /= 0
    Thu n -> n /= 0
    Fri n -> n /= 0)

测试验证

用你给出的输入测试:

testInput :: [Days]
testInput = [(Mon 1), (Tue 0), (Wed 2), (Wed 0), (Thu 0)]

-- 调用filterNonZeroDays testInput,结果为 [(Mon 1),(Wed 2)]

内容的提问来源于stack exchange,提问作者Neil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:20:33