Haskell如何向函数传入未知长度列表并实现全元素条件判断
解决方案
首先要明确:你的需求需要返回Maybe [Int]类型,因为存在返回Nothing的场景,不能直接返回[Int]。
情况1:第一个参数是普通Int列表(对应你的示例)
我们可以用all (>3)快速判断列表中所有元素是否都大于3,再根据结果返回对应值:
secondTest :: [Int] -> [Int] -> Maybe [Int] secondTest a b = if all (>3) a then Just b else Nothing
测试你的示例:
secondTest [4,4] [1,2]→Just [1,2]secondTest [4,4,4] [1,2]→Just [1,2]secondTest [4,1,4] [1,2,9]→Nothing
完全符合预期逻辑。
情况2:第一个参数是(Int, Int)元组列表(对应你最初的函数)
如果要处理元组列表,需要检查每个元组的两个Int值都大于3,同样用all搭配自定义谓词实现:
secondTest :: [(Int, Int)] -> [Int] -> Maybe [Int] secondTest a b = if all (\(m,n) -> m > 3 && n > 3) a then Just b else Nothing
示例验证:
secondTest [(4,5), (6,7)] [1,2]→Just [1,2]secondTest [(4,2), (5,6)] [1,2]→Nothing
你之前代码的问题
你写的列表推导式[ x | m <- a, x <- b, m > 3 ]逻辑是:遍历a中所有大于3的元素,每遇到一个就把b的元素完整复制一次返回。比如a = [4,1,4]时,会因为有两个符合条件的元素,返回[1,2,9,1,2,9],这和你要的「全满足才返回b,否则返回Nothing」完全不符。而all函数可以直接对整个列表做统一判断,精准匹配你的需求。
内容的提问来源于stack exchange,提问作者u6785764
相关产品推荐
相关产品推荐

