Haskell中如何检查元组元素并提取符合条件的整数?
问题解决思路
先拆解你代码里的几个核心问题:
模式匹配的语法错误
你定义的number'是接受两个参数的函数(待处理列表和累加器),但分支里写成了((mat,1.0): xs) a,这不符合Haskell的函数参数语法——正确写法应该把模式作为第一个参数,累加器作为第二个参数,也就是number' ((mat,1.0):xs) a。变量名遮蔽问题
第三个分支里的lst和外部的lst重名,会遮蔽外部变量,而且这里应该匹配任意Double值,换个名字比如d更合理。
修正后的基础版本代码
number :: [(Integer, Double)] -> [Integer] number lst = number' lst [] where number' [] a = a number' ((mat, 1.0):xs) a = number' xs (mat : a) number' ((_, _):xs) a = number' xs a
额外注意事项
- 浮点数精度问题:直接用
1.0模式匹配只对字面量的1.0有效,如果是计算得到的近似1.0(比如1.0 + 1e-16),模式匹配会失败。这种场景下应该用显式比较:number :: [(Integer, Double)] -> [Integer] number lst = number' lst [] where number' [] a = a number' ((mat, d):xs) a | abs (d - 1.0) < 1e-9 = number' xs (mat : a) -- 加误差范围判断近似相等 | otherwise = number' xs a - 结果顺序问题:上面的递归版本是把元素加到累加器头部,最终结果是原列表的逆序。如果需要和原列表顺序一致,可以最后反转累加器,或者用更简洁的列表推导式(推荐):
number lst = [mat | (mat, d) <- lst, abs (d - 1.0) < 1e-9]
内容的提问来源于stack exchange,提问作者zeppal
相关产品推荐
相关产品推荐

