Haskell在另一个函数中使用多个函数

时间:2018-09-24 17:18:25

标签: haskell

我正在创建一个程序来计算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函数所做的计算,则可以使它正常工作,但这是为学校分配的作业,因此必须定义这些功能。

1 个答案:

答案 0 :(得分:3)

在您的cubicRealSolution中,您写道:

where q = cubicQ

(还有其他一些声明,但是所有这些声明都存在相同的问题)。

此问题是您现在定义类型为q的函数q :: Float -> Float -> Float -> Float。因此,您不进行函数调用,只需声明q一个函数即可。

您用cubicQ a b c调用函数(其中abc是在{{的 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旨在计算三次多项式的根,那么它似乎返回错误的结果。因此仍然存在语义上的问题。

相关问题