首页 > 解决方案 > 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 我不知道从哪里开始。如果我删除所有函数,而只是让我的变量等于函数所做的计算,我可以让它工作,但这是为了学校作业,所以我必须定义这些函数。

标签: haskell

解决方案


在你的cubicRealSolution,你写:

where q = cubicQ

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

问题在于您现在定义了一个q带有 type的函数q :: Float -> Float -> Float -> Float。因此,您无需进行函数调用,只需声明q一个函数。

您使用cubicQ a b c(wherea和是在头部中定义的 de 标识符b,不要与函数混淆) 调用该函数。ccubicRealSolutioncubicQ

因此,至少会进行类型检查的函数可能如下所示:

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

因此,Haskell不会查找具有相同名称的标识符,然后使用此参数调用函数。在我看来,这种“按名称检索”非常不安全,因为添加一个额外的参数(或重命名一个)可能会产生各种难以预测的影响。事实上,参数的名称通常并不重要(有一些值得注意的例外,比如在模板 Haskell中编写部分)。

然而,如果cubicQ旨在计算三次多项式的根,那么它似乎返回了错误的结果。所以仍然存在语义问题。


推荐阅读