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

Haskell中main方法内如何使用if语句?数对求和代码报错求解

Haskell两数之和功能实现报错解决

你代码中的核心错误点

  • 语法层面触发解析报错的直接原因有两个:Haskell中if是必须同时带then和else分支的表达式,你只写了then分支没有else;其次非do块内的let必须搭配in子句指定绑定的作用范围,你写的let thePairs = zip x y没有后续in语句,直接触发语法错误。
  • 类型逻辑层面存在多处不匹配:你给findPairs定义的参数是两个[Int]列表,但函数体内直接对x、y做加法运算,列表不支持直接相加;函数签名声明返回([[Int]], Int)类型,但你没有返回符合要求的结果;main函数为IO类型,直接调用返回纯值的findPairs不符合语法要求。
  • 业务逻辑层面存在问题:你直接遍历两次数组取数对,会出现(1,9)和(9,1)的重复结果,和你预期的输出不符。

修正后的可运行代码

这里提供符合你需求的简单实现,通过索引约束避免重复数对:

-- 第一个参数为目标和,第二个参数为输入数组,返回所有符合要求的无序数对
findPairs :: Int -> [Int] -> [(Int, Int)]
findPairs target arr = [(x, y) | (i, x) <- indexedArr, (j, y) <- indexedArr, i < j, x + y == target]
  where indexedArr = zip [0..] arr -- 给数组元素加索引,用于去重

main :: IO ()
main = print $ findPairs 10 [1, 8, 5, 2, 5, 6, 7, 3, 9, 4]

运行上述代码输出结果为:

[(1,9),(8,2),(5,5),(6,4),(7,3)]

和你预期的结果一致,仅顺序有细微差异,若需要完全匹配你给出的顺序,可添加排序逻辑调整。

额外优化建议

如果处理的数组规模较大,上述列表推导式的O(n²)复杂度性能较差,可以先对数组排序,再用双指针法实现O(nlogn)复杂度的版本,更适合大数据量场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:45:03