Haskell程序,用于计算第三根

时间:2018-09-29 00:04:51

标签: haskell

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)

1 个答案:

答案 0 :(得分:1)

从语法上讲,您的程序没有意义,这就是编译器所抱怨的。首先,if语句随处可见;它与cubicRealSolutions的作用域不同。我建议修改和阅读有关letif和函数语法的某些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

但是,此代码仍然存在主要问题,并且无法编译,因为rootcubicDisccubicScubicT是没有定义的。另外,您永远不要使用我觉得很奇怪的参数cd,因为您可能想使用它们。最后,if语句必须评估为同一类型,因此else评估为空列表而不是字符串。甚至我的修订版也不是“好的”风格。 where子句中的语句太多。如果发生这种情况,最好将函数分解为较小的部分,以避免运行where子句。我已经使用...来指示需要为编译器定义的内容。

参考:LYAH

PS:就个人而言,我发现where语法比let更易于理解,但这取决于个人风格的选择。尽管letwhere灵活一些。

编辑:我用占位符值定义了rootcubicScubicT,以说明它们必须计算为Double