如何为Haskell组合生成函数添加匿名函数过滤参数?
解决Haskell函数扩展问题
正确的类型签名
首先,你的类型签名存在两处错误:
- 过滤函数的参数应定义为
a -> b -> Bool(分别接收两个列表的元素),而非a1 -> a1 -> Bool(强制要求两个元素类型相同)。 - 返回类型需明确为
[(a, b)],而非模糊的t。
修正后的类型签名:
func :: [a] -> [b] -> (a -> b -> Bool) -> [(a, b)]
实现方式
方式1:列表推导式(简洁易读)
列表推导式天然适配笛卡尔积生成+过滤的场景:
func xs ys predicate = [(x, y) | x <- xs, y <- ys, predicate x y]
方式2:基于原有代码修改
在你原有的组合生成逻辑后,添加filter步骤处理过滤:
func xs ys predicate = filter (\(x, y) -> predicate x y) allPairs where allPairs = concat (map (\x -> map (\y -> (x, y)) ys) xs)
示例验证
调用你提供的测试用例:
func [1,2,3] [4,5] (\a b -> a + b > 6)
输出结果为:[(2,5),(3,4),(3,5)],完全符合预期。
原类型签名错误解析
(a1 -> a1 -> Bool)限制了过滤函数的两个参数必须是同一类型,但你的函数应该支持不同类型的输入列表(比如[String]和[Int])。- 未明确返回类型
t,Haskell无法推断出你要返回过滤后的元组列表,直接导致编译失败。
内容的提问来源于stack exchange,提问作者RLP
相关产品推荐
相关产品推荐

