我正在尝试实现law of cosines函数,这是我的代码:
cosC :: [a] -> a
cosC sides
| length sides < 3 = 0
| otherwise = (x ^ 2 + y ^ 2 - z ^ 2) / (2 * x * y)
where x = head(tail(tail(sides)))
y = head(tail(sides))
z = head(sides)
但我得到两个错误:
No instance for (Fractional a)
arising from a use of `/'
In the expression: (x ^ 2 + y ^ 2 - z ^ 2) / (2 * x * y)
In an equation for `cosC':
cosC sides
| length sides < 3 = 0
| otherwise = (x ^ 2 + y ^ 2 - z ^ 2) / (2 * x * y)
where
x = head (tail (tail (sides)))
y = head (tail (sides))
z = head (sides)
和
No instance for (Num a)
arising from the literal `2'
In the first argument of `(*)', namely `2'
In the first argument of `(*)', namely `2 * x'
In the second argument of `(/)', namely `(2 * x * y)'
编辑:我已修正上述余弦定律中的符号拼写错误。感谢Daniel Fischer指出这一点。
答案 0 :(得分:11)
您正在尝试计算常规类型 a
的数值结果,这些结果不可行。 (这就像试图建造一座桥梁不仅适用于一般公路车辆,而且适用于一般的事物,例如宇宙飞船,摩天大楼,纸夹和中子星)。只需将Floating
约束添加到:
cosC :: Floating a => [a] -> a
您可以执行此类计算所需的任何算术运算。 (Fractional
实际上足够用于此功能,但您将无法计算结果的arccos
。
与您的问题无关,请注意在Haskell中分解列表有更好的方法:
cosC (x:y:z:_) = (x^2 + y^2 - z^2) / (2*x*y)
cosC _ = 0
等同于您的定义。你为什么把这些论据作为一个列表呢?这是一个很好的Lisp-ish的事情,在Haskell我更喜欢
cosC :: Floating a => a -> a -> a -> a
cosC x y z = (x^2 + y^2 - z^2) / (2*x*y)
答案 1 :(得分:5)
cosC :: Fractional a => [a] -> a
这就是你能找到的结果(ghci
):
*Main> let fun [x, y, z] = (x * x + y * y + z * z) / (2 * x * y)
*Main> :type fun
fun :: Fractional a => [a] -> a