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

Haskell路径坐标生成函数正确性验证求助

Haskell路径坐标生成函数修正

首先你写的getPaths函数存在几个明显问题:

  • 模式匹配范围太窄:只匹配了单元素列表[((xa, ya), (xb, yb))],但输入是任意长度的列表(比如示例里的两条路径),无法处理多路径输入。
  • 守卫语法错误:| xa == xb : [(xa, yb + 1) | yb < ya]++这种写法不符合Haskell语法,守卫的正确格式是| 条件 = 表达式,同时你错误混用:和++拼接逻辑,生成逻辑也不完整。
  • 路径生成逻辑缺失:只生成了增量的点,没有包含起点、终点以及所有中间节点,比如垂直路径应该覆盖从起点y到终点y的所有整数坐标。

修正后的实现思路

  1. 先写一个处理单条路径的函数getPath,负责把单个端点对转换成完整路径坐标。
  2. 用map把这个函数应用到输入列表的每个元素上,得到最终的多路径结果。

完整代码

-- 处理单条路径:从端点对生成完整坐标列表
getPath :: ((Integer, Integer), (Integer, Integer)) -> [(Integer, Integer)]
getPath ((xa, ya), (xb, yb))
  -- 垂直路径:x坐标相同,生成所有y从min到max的点
  | xa == xb = [(xa, y) | y <- [min ya yb .. max ya yb]]
  -- 水平路径:y坐标相同,生成所有x从min到max的点
  | ya == yb = [(x, ya) | x <- [min xa xb .. max xa xb]]
  -- 根据题目要求,所有路径要么水平要么垂直,这里加兜底报错(可选)
  | otherwise = error "路径既不是水平也不是垂直"

-- 处理多条路径:对每个路径应用getPath
getPaths :: [((Integer, Integer), (Integer, Integer))] -> [[(Integer, Integer)]]
getPaths = map getPath

测试示例

输入[((0, 0), (0, 3)), ((0, 2), (2, 2))],调用getPaths后输出:

[[(0,0),(0,1),(0,2),(0,3)],[(0,2),(1,2),(2,2)]]

完全符合你的期望。

关键细节说明

  • 使用min和max处理端点顺序:不管输入的端点是从大到小还是从小到大,都能生成正确的连续坐标序列。
  • 列表推导式[min ya yb .. max ya yb]会自动生成包含两端的所有整数,完美覆盖中间节点。
  • getPaths用map处理整个列表,简洁高效,支持任意长度的输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:15:53