Haskell Quadratic解决方案查找器 - 错误

时间:2016-10-02 21:39:23

标签: haskell quadratic

我在大学里使用Haskell,我要做的其中一个练习就是创建一个函数,当我给它系数时,给我一个二次方程的根,使用前面的函数告诉我它有多少解。这就是我所做的:

第一个功能,这个工作正常:

nRoots :: Float -> Float -> Float -> Int
nRoots a b c | r<0 = 0
             | r==0 = 1
             | otherwise = 2
             where r = b^2-4*a*c

第二个功能,它不起作用:

roots :: Float -> Float -> Float -> [Float]
roots a b c | nRoots==2 = [(-b-sqrt(b^2-4*a*c))/(2*a),(-b+sqrt(b^2-4*a*c))/(2*a)]
            | nRoots==1 = [-b/(2*a)] 
            | otherwise = []

这是我得到的错误:

raizes.hs:8:21:
    No instance for (Eq (Float -> Float -> Float -> Int))
      (maybe you haven't applied enough arguments to a function?)
      arising from a use of ‘==’
    In the expression: nRoots == 2
    In a stmt of a pattern guard for
                   an equation for ‘roots’:
      nRoots == 2
    In an equation for ‘roots’:
        roots a b c
          | nRoots == 2
          = [(- b - sqrt (b ^ 2 - 4 * a * c)) / (2 * a),
             (- b + sqrt (b ^ 2 - 4 * a * c)) / (2 * a)]
          | nRoots == 1 = [- b / (2 * a)]
          | otherwise = []

raizes.hs:8:23:
    No instance for (Num (Float -> Float -> Float -> Int))
      (maybe you haven't applied enough arguments to a function?)
      arising from the literal ‘2’
    In the second argument of ‘(==)’, namely ‘2’
    In the expression: nRoots == 2
    In a stmt of a pattern guard for
                   an equation for ‘roots’:
      nRoots == 2

知道发生了什么事吗?

提前致谢

编辑:感谢所有答案!我现在感到非常愚蠢,因为没有注意到它:X

3 个答案:

答案 0 :(得分:5)

您没有将任何参数传递给nRoots。您可以通过将系数传递给nRoots

来修复错误
roots a b c | nRoots a b c ==2 = ...

错误消息告诉您无法检查类似Eq的{​​{1}}等内容的nRoots实例),并且& #39;无法将数字Float -> Float -> Float -> Int转换为具有相同类型的数字(无2实例)。这两个错误都来自表达式Num

答案 1 :(得分:1)

您需要向nRoots提供适当的参数,特别是roots a b c | nRoots a b c == 2 = ...

您的错误消息告诉您,但是,让我们来看看您应该如何从GHC读取此错误消息,以弄清楚这是您的问题。我在下面用几个部分标记标记了错误消息。

raizes.hs:8:21:
    ---------------------BEGIN SECTION A--------------------
    No instance for (Eq (Float -> Float -> Float -> Int))
      (maybe you haven't applied enough arguments to a function?)
      arising from a use of ‘==’
    In the expression: nRoots == 2
    ---------------------END SECTION A--------------------
    ---------------------BEGIN SECTION B--------------------
    In a stmt of a pattern guard for
                   an equation for ‘roots’:
      nRoots == 2
    In an equation for ‘roots’:
        roots a b c
          | nRoots == 2
          = [(- b - sqrt (b ^ 2 - 4 * a * c)) / (2 * a),
             (- b + sqrt (b ^ 2 - 4 * a * c)) / (2 * a)]
          | nRoots == 1 = [- b / (2 * a)]
          | otherwise = []
    ---------------------END SECTION B--------------------

raizes.hs:8:23:
    ---------------------BEGIN SECTION C--------------------
    No instance for (Num (Float -> Float -> Float -> Int))
      (maybe you haven't applied enough arguments to a function?)
      arising from the literal ‘2’
    In the second argument of ‘(==)’, namely ‘2’
    In the expression: nRoots == 2
    In a stmt of a pattern guard for
                   an equation for ‘roots’:
      nRoots == 2
   ---------------------END SECTION C--------------------

首先让我们回顾一下==的类型。

(==) :: Eq a => a -> a -> Bool

SECTION A告诉您==需要相等类型类(Eq)的实例才能工作,因为它已经重载以适用于具有Eq的任何类型实例。遗憾的是Eq nRoots没有{并且可能没有非平凡的'实例,因为nRoots本身就是一个函数(想想停止问题)。 GHC在这里给出的提示正是你的问题,即GHC注意到你试图比较函数的相等性(在这种情况下是一个数字)并建议maybe you haven't applied enough arguments to a function?

好吧,就在SECTION A之后,我们似乎已经知道你所面临的问题了,但我们在这里不要太仓促,也许情况SECTION BSECTION C会表明您在SECTION A中看到的错误只是由更深层次的错误导致的超级错误。

SECTION B真的只是告诉你SECTION A中问题的确切位置,所以这不是什么新鲜事。

SECTION C怎么样?还记得==的类型吗?事实证明==期望等式的两边都是相同的类型。现在,GHC看到nRoots == 2并期望nRoots2属于同一类型。 Haskell中的数字文字被重载为Num a => a类型,以便它们可以同时表示Int s,Integer s,Double s,Rational s,所以现在GHC希望nRoots属于Num a => a类型,其中a必须是Float -> Float -> Float -> Int,即它期望nRootsNum的实例。 nRoots类型类。

正如GHC精明暗示的那样,这实际上只是同一问题的另一个症状!也就是说你忘了将参数实际应用到Section A,因此GHC正试图处理一个裸函数而不是函数的输出。

所以Section CnRoots都告诉你你有同样的问题,即当你应该完全应用你的参数时,你试图使用一个函数本身Scanner该函数并使用该函数的输出。

答案 2 :(得分:0)

你没有在第二个函数的守卫中将你的函数nRoot应用到它的参数中。将您的函数nRoots应用于参数abc,然后您就可以比较它的结果。

http://s017.radikal.ru/i400/1610/83/ca51acaf1362.png