The error now iCouldn't match expected type ‘Double’
with actual type ‘Double -> Double -> Double -> Double’ , Probable cause: ‘(+)’ is applied to too few arguments
在表达式中:cubicQ ^ 3 + r ^^ 2 在“ cubicDisc”的方程式中:cubicDisc q r = cubicQ ^ 3 + r ^^ 2
cubicR :: Double -> Double -> Double -> Double -> Double
cubicR a b c d = (9*a*b*c-27*a^^2*d-2*b^^3)/(54*a^^3)
cubicQ :: Double -> Double -> Double -> Double
cubicQ a b c = (3*a*c-b^^2)/(9*a^^2)
cubicDisc :: Double -> Double -> Double
cubicDisc q r = cubicQ^3 + r^^2
cubicS :: Double -> Double -> Double
cubicS q r = (r + sqrt(q^^3+r^^2))**(1/3)
cubicT :: Double -> Double -> Double
cubicT q r = (r - sqrt(q^^3+r^^2))**(1/3)
cubicRealSolutions :: Double -> Double -> Double -> Double -> [Double]
cubicRealSolutions a b c d = if cubicDisc > 0 || root == 0
then [rootOne,rootTwo,rootThree]
else []
where
rootOne= (cubicS + cubicT) - b/(3*a)
rootTwo = (cubicS+cubicT)/2 -(b)/(3*a) + sqrt(3)/2*(cubicS-cubicT)
rootThree = (cubicS+cubicT)/2 -(b)/(3*a) + sqrt(3)/2*(cubicS-cubicT)
答案 0 :(得分:1)
从语法上讲,您的程序没有意义,这就是编译器所抱怨的。首先,if
语句随处可见;它与cubicRealSolutions
的作用域不同。我建议修改和阅读有关let
,if
和函数语法的某些Haskell文档。现在,如果您是我,请按以下步骤清理代码:
cubicRealSolutions :: Double -> Double -> Double -> Double -> [Double]
cubicRealSolutions a b c d = if cubicDisc > 0 || root == 0
then [rootOne,rootTwo,rootThree]
else []
where
root = 0
rootOne= (cubicS + cubicT) - b/(3*a)
rootTwo = (cubicS+cubicT)/2 -(b)/(3*a) + sqrt(3)/2*(cubicS-cubicT)
rootThree = (cubicS+cubicT)/2 -(b)/(3*a) + sqrt(3)/2*(cubicS-cubicT)
cubicDisc = 18*a*b*c*d - 4*(b^3)*d + (b^2)*(c^2) - 4*a*c^3 - 27*(a^2)*(d^2)
cubicS = 0.1
cubicT = 0.2
但是,此代码仍然存在主要问题,并且无法编译,因为root
,cubicDisc
,cubicS
,cubicT
是没有定义的。另外,您永远不要使用我觉得很奇怪的参数c
或d
,因为您可能想使用它们。最后,if
语句必须评估为同一类型,因此else
评估为空列表而不是字符串。甚至我的修订版也不是“好的”风格。 where
子句中的语句太多。如果发生这种情况,最好将函数分解为较小的部分,以避免运行where
子句。我已经使用...
来指示需要为编译器定义的内容。
参考:LYAH
PS:就个人而言,我发现where
语法比let
更易于理解,但这取决于个人风格的选择。尽管let
比where
灵活一些。
编辑:我用占位符值定义了root
,cubicS
和cubicT
,以说明它们必须计算为Double
。