我在大学里使用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答案 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 B
和SECTION C
会表明您在SECTION A
中看到的错误只是由更深层次的错误导致的超级错误。
嗯SECTION B
真的只是告诉你SECTION A
中问题的确切位置,所以这不是什么新鲜事。
SECTION C
怎么样?还记得==
的类型吗?事实证明==
期望等式的两边都是相同的类型。现在,GHC看到nRoots == 2
并期望nRoots
和2
属于同一类型。 Haskell中的数字文字被重载为Num a => a
类型,以便它们可以同时表示Int
s,Integer
s,Double
s,Rational
s,所以现在GHC希望nRoots
属于Num a => a
类型,其中a
必须是Float -> Float -> Float -> Int
,即它期望nRoots
是Num
的实例。 nRoots
类型类。
正如GHC精明暗示的那样,这实际上只是同一问题的另一个症状!也就是说你忘了将参数实际应用到Section A
,因此GHC正试图处理一个裸函数而不是函数的输出。
所以Section C
和nRoots
都告诉你你有同样的问题,即当你应该完全应用你的参数时,你试图使用一个函数本身Scanner
该函数并使用该函数的输出。
答案 2 :(得分:0)
你没有在第二个函数的守卫中将你的函数nRoot
应用到它的参数中。将您的函数nRoots
应用于参数a
,b
和c
,然后您就可以比较它的结果。