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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:25:23