Haskell多重where语句

Haskell多重where语句,haskell,Haskell,我不明白什么是无效的 solveCubic a b c d = (-b/(3*a) - C/(3*a) - (b*b - 3*a*c)/(3*a*C), 0, 0) where Q = cbrt ((2*(b**3) - 9*a*b*c + 27*a*a*d)**2 - 4*((b*b - 3*a*c)**3)) C = cbrt ((1/2)*(Q + 2*(b**3) - 9*a*b*c + 27*a*a*d)) 错误是 main.hs:19:11: e

我不明白什么是无效的

solveCubic a b c d = (-b/(3*a) - C/(3*a) - (b*b - 3*a*c)/(3*a*C), 0, 0)
    where Q = cbrt ((2*(b**3) - 9*a*b*c + 27*a*a*d)**2 - 4*((b*b - 3*a*c)**3))
          C = cbrt ((1/2)*(Q + 2*(b**3) - 9*a*b*c + 27*a*a*d))
错误是

    main.hs:19:11: error: Not in scope: data constructor `Q'
   |
19 |     where Q = cbrt ((2*(b**3) - 9*a*b*c + 27*a*a*d)**2 - 4*((b*b - 3*a*c)**3))
   |           ^

main.hs:20:11: error: Not in scope: data constructor `C'
   |
20 |           C = cbrt ((1/2)*(Q + 2*(b**3) - 9*a*b*c + 27*a*a*d))

变量名不能以大写字母开头。当我们处理类型而不是表达式时,以大写字母开头的标识符保留给构造函数名或类型名


因此,Q和C在代码中被视为构造函数名称,这就是为什么编译器抱怨没有定义具有这些名称的构造函数。将它们命名为q和c,问题就会消失。

变量名不能以大写字母开头。当我们处理类型而不是表达式时,以大写字母开头的标识符保留给构造函数名或类型名

因此,Q和C在代码中被视为构造函数名称,这就是为什么编译器抱怨没有定义具有这些名称的构造函数。将它们命名为q和c,问题就会消失。

变量以小写或某些符号开头,但这与此处无关,类型构造函数、数据构造函数、类型类等都以大写开头

因此,您可以通过以下方式解决此问题:

solveCubic a b c d = (-b/(3*a) - e/(3*a) - (b*b - 3*a*c)/(3*a*e), 0, 0)
    where q = cbrt ((2*(b**3) - 9*a*b*c + 27*a*a*d)**2 - 4*((b*b - 3*a*c)**3))
          e = cbrt ((1/2)*(q + 2*(b**3) - 9*a*b*c + 27*a*a*d))
变量以小写或某些符号开头,但这与此处无关,类型构造函数、数据构造函数、类型类等都以大写开头

因此,您可以通过以下方式解决此问题:

solveCubic a b c d = (-b/(3*a) - e/(3*a) - (b*b - 3*a*c)/(3*a*e), 0, 0)
    where q = cbrt ((2*(b**3) - 9*a*b*c + 27*a*a*d)**2 - 4*((b*b - 3*a*c)**3))
          e = cbrt ((1/2)*(q + 2*(b**3) - 9*a*b*c + 27*a*a*d))

变量以小写开头。变量以小写开头。