Haskell向量运算技术问询:向量加法、点积及直角判断
Haskell 三维向量操作函数修正与实现
原代码的问题说明
- 类型签名错误:原函数的类型签名未正确匹配三维向量结构,向量需用
(a,a,a)表示,而非单个a - 语法/逻辑错误:
- 向量加法的返回值未用逗号构造三元组,Haskell中必须通过逗号分隔元组元素
- 点积逻辑错误,点积是各分量乘积的和,而非构造新元组
1. 正确的向量加法函数
向量加法需对两个三维向量的对应分量分别相加,返回新的三维向量:
addVectors :: (Num a) => (a, a, a) -> (a, a, a) -> (a, a, a) addVectors (a1, a2, a3) (b1, b2, b3) = (a1 + b1, a2 + b2, a3 + b3)
类型签名(Num a) => (a,a,a) -> (a,a,a) -> (a,a,a)表示:接收两个同类型的三维数值向量,返回同类型的三维向量
2. 正确的点积(scalarProduct)函数
点积是对应分量乘积的总和,返回一个标量:
scalarProduct :: (Num a) => (a, a, a) -> (a, a, a) -> a scalarProduct (a1, a2, a3) (b1, b2, b3) = a1 * b1 + a2 * b2 + a3 * b3
类型签名末尾的a表示返回值是单个数值(标量),符合点积的数学定义
3. 判断两向量夹角是否为直角的函数
两向量垂直(夹角为直角)当且仅当它们的点积为0,函数需同时约束Num(支持点积计算)和Eq(支持等于0的判断):
isRightAngle :: (Num a, Eq a) => (a, a, a) -> (a, a, a) -> Bool isRightAngle v1 v2 = scalarProduct v1 v2 == 0
直接复用已实现的scalarProduct函数,判断结果是否等于0,返回布尔值表示是否垂直
内容的提问来源于stack exchange,提问作者iTzTomy
相关产品推荐
相关产品推荐

