Haskell路径坐标生成函数正确性验证求助
Haskell路径坐标生成函数修正
首先你写的getPaths函数存在几个明显问题:
- 模式匹配范围太窄:只匹配了单元素列表
[((xa, ya), (xb, yb))],但输入是任意长度的列表(比如示例里的两条路径),无法处理多路径输入。 - 守卫语法错误:
| xa == xb : [(xa, yb + 1) | yb < ya]++这种写法不符合Haskell语法,守卫的正确格式是| 条件 = 表达式,同时你错误混用:和++拼接逻辑,生成逻辑也不完整。 - 路径生成逻辑缺失:只生成了增量的点,没有包含起点、终点以及所有中间节点,比如垂直路径应该覆盖从起点y到终点y的所有整数坐标。
修正后的实现思路
- 先写一个处理单条路径的函数
getPath,负责把单个端点对转换成完整路径坐标。 - 用
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
相关产品推荐
相关产品推荐

