Haskell编写k近邻算法时出现`a'与`Double'类型不匹配错误如何解决
Haskell k近邻算法报错修复方案
报错根因
- 类型不匹配:
nearPoints函数的类型签名支持泛型类型a的点,而你硬编码调用的pointsDistCalc仅支持Double类型的点,二者类型无法匹配。 - 传入参数未正确使用:
nearPoints已经接收了通用度量函数d作为入参,不需要硬编码绑定欧氏距离计算逻辑,直接使用传入的d即可兼容泛型设计。 pointsDistCalc自身存在语法错误:模式匹配中写的(t1,t1)是相等约束,只会匹配横纵坐标完全相等的点,且距离计算逻辑也写错了Y轴差值部分。
修复后代码
import Data.List type Point a = (a,a) type Metric a = Point a -> Point a -> Double -- 通用k近邻查询,sortOn为稳定排序,距离相等时保留原列表顺序 nearPoints :: Int -> Metric a -> Point a -> [Point a] -> [Point a] nearPoints k d p ps = take k $ sortOn (d p) ps -- 修复后的欧氏距离计算函数,仅适用于Double类型的点 pointsDistCalc :: Metric Double pointsDistCalc (x1, y1) (x2, y2) = sqrt $ (x1 - x2)^2 + (y1 - y2)^2
验证说明
- 当输入点列表
ps的长度小于k时,take k会自动返回全部元素,符合需求。 Data.List.sortOn为稳定排序算法,距离相等的点会保留在原列表ps中的初始顺序,符合需求。- 支持任意自定义度量函数,只需要传入符合
Metric a类型签名的函数即可,不需要修改nearPoints的逻辑。
内容的提问来源于stack exchange,提问作者Bella James
相关产品推荐
相关产品推荐

