如何过滤双列表生成的元组列表?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
相关产品推荐
相关产品推荐

