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
相关产品推荐
相关产品推荐

