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
相关产品推荐
相关产品推荐

