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

如何过滤双列表生成的元组列表?Haskell代码报错排查

问题解决方法

你的报错根源很明确:你传给func的lambda是两个独立参数的函数,但代码里filter需要的是接受单个元组的函数。

方案1:修改传入的lambda(不改动原函数)

把原来的二元lambda改成接受元组的形式,用括号把参数括起来:

func [1,2,3] [4,5] (\(a,b) -> a + b > 6)

这样lambda的类型就匹配(a,b)->Bool了,filter能正常调用它过滤元组列表。

方案2:修改func函数(适配二元lambda)

如果想保留\a b -> ...的写法,可以调整函数的参数类型,用uncurry把二元函数转成处理元组的函数:

func :: [a] -> [b] -> (a -> b -> Bool) -> [(a, b)]
func xs ys f = filter (uncurry f) tup
    where
        tup = [(x,y) | x <- xs, y <- ys]  -- 用列表推导式替代concat(map...),更简洁

uncurry的作用就是把a->b->Bool类型的二元函数,转换成(a,b)->Bool类型的一元函数,刚好适配filter的要求。

另外提一句:你原来生成所有组合的tup代码,用列表推导式[(x,y) | x<-xs, y<-ys]实现完全一样,而且可读性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:35:24