我正在创建一个程序来计算haskell中三次方程的解。我是功能语言的新手,但遇到了一些困难。这是我的代码:
cubicQ :: Float -> Float -> Float -> Float
cubicQ a b c = ((3 * a * c) - (b**2)) / (9 * (a**2)) --calculates Q
cubicR :: Float -> Float -> Float -> Float -> Float
cubicR a b c d = ((9 * a * b * c) - (27 * a**2 * d) - (2 * b**3)) / (54
* a**3)--calculates R
cubicS :: Float -> Float -> Float
cubicS r q = (r + (sqrt(q**3 + r**2))) ** (1/3)--calculates S
cubicT :: Float -> Float -> Float
cubicT q r = (r - (sqrt(q**3 + r**2))) ** (1/3)--calculates T
check :: Float -> Float -> Float
check q r = ((q**3)+(r**2)) --checks for real numbers
x1 :: Float -> Float -> Float -> Float -> Float
x1 s t a b = (s + t) - (b / (3 * a)) --calculates x1
cubicRealSolution :: Float -> Float -> Float -> Float -> Float
--defines function which takes input and solves
cubicRealSolution a b c d = if l < 0 then error "NaN" else (sol) --Check
for real numbers
where
q = cubicQ
r = cubicR
s = cubicS
t = cubicT
l = check
sol = x1
我在编译时收到此错误,* Couldn't match expected type Float'
with actual type Float -> Float -> Float -> Float -> Float'
* Probable cause: sol' is applied to too few arguments
我不确定从这里去哪里。如果我删除所有功能,而是使变量等于thr函数所做的计算,则可以使它正常工作,但这是为学校分配的作业,因此必须定义这些功能。
答案 0 :(得分:3)
在您的cubicRealSolution
中,您写道:
where q = cubicQ
(还有其他一些声明,但是所有这些声明都存在相同的问题)。
此问题是您现在定义类型为q
的函数q :: Float -> Float -> Float -> Float
。因此,您不不进行函数调用,只需声明q
一个函数即可。
您用cubicQ a b c
调用函数(其中a
,b
和c
是在{{的 head 1}},不要与cubicRealSolution
函数混淆)。
因此至少要进行类型检查的函数应如下所示:
cubicQ
因此Haskell不会不查找具有相同名称的标识符,然后使用此参数调用该函数。在我看来,这样的“按名称检索”是非常不安全的,因为添加一个额外的参数(或重命名一个参数)可能会带来各种难以预料的影响。实际上,参数的名称通常并不重要(有一些值得注意的例外,例如在模板Haskell 中编写部件)。
如果cubicRealSolution :: Float -> Float -> Float -> Float -> Float
cubicRealSolution a b c d = if l < 0 then error "NaN" else sol
where q = cubicQ a b c
r = cubicR a b c d
s = cubicS r q
t = cubicT q r
l = check q r
sol = x1 s t a b
旨在计算三次多项式的根,那么它似乎返回错误的结果。因此仍然存在语义上的问题。