haskell - 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
我不知道从哪里开始。如果我删除所有函数,而只是让我的变量等于函数所做的计算,我可以让它工作,但这是为了学校作业,所以我必须定义这些函数。
解决方案
在你的cubicRealSolution
,你写:
where q = cubicQ
(还有其他一些声明,但这些声明都存在同样的问题)。
问题在于您现在定义了一个q
带有 type的函数q :: Float -> Float -> Float -> Float
。因此,您无需进行函数调用,只需声明q
一个函数。
您使用cubicQ a b c
(wherea
和是在头部中定义的 de 标识符b
,不要与函数混淆) 调用该函数。c
cubicRealSolution
cubicQ
因此,至少会进行类型检查的函数可能如下所示:
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
旨在计算三次多项式的根,那么它似乎返回了错误的结果。所以仍然存在语义问题。
推荐阅读
- list - 是否可以删除 SharePoint 视图页面上的列表名称?
- reactjs - 如何在反应中重定向到另一条路线?
- python - 将 Dataframe 作为新表导出到 MSSQL Server
- spring-boot - 防止在运行测试时触发 AOP(AspectJ) 代码
- drupal - 如何使 Drupal Commerce 配置实体可修改
- java - 优化 Map 中过滤值的方法
- sql-server - 如何使用 Zumero 在同步时合并记录而不是添加它?
- triggers - 创建一个触发器来验证 Product 对象的数据
- angular - 使用 TestBed.CompileComponents().then() 的 Angular 最佳实践
- javascript - 从右到左的水平时间轴未按预期工作