quadraticRoots :: Floating t => t -> t -> t -> (t, t)
quadraticRoots a b c = if d < 0 then error "0" else (x, y)
where
x = e + sqrt d / (2 * a)
y = e - sqrt d / (2 * a)
d = b * b - 4 * a * c
e = - b / (2 * a)
以上代码在Hugs中给出以下错误:
Cannot justify constraints in explicitly typed binding
*** Expression : quadraticRoots
*** Type : Floating a => a -> a -> a -> (a,a)
*** Given context : Floating a
*** Constraints : Ord a
任何人都可以帮我解释一下吗?
答案 0 :(得分:4)
为了进行d < 0
之类的比较,您要比较的内容必须是Ord
类型类的成员。因此,我们需要修改我们的类型签名以包含附加约束Ord
:
quadraticRoots :: (Ord t, Floating t) => t -> t -> t -> (t, t)
答案 1 :(得分:1)
您的类型签名称t
位于Floating
类型类中,但编译器发现它也必须位于Ord
中。
Ord
Floating
~> :t quadraticRoots
quadraticRoots :: (Ord t, Floating t) => t -> t -> t -> (t, t)
<
,一切都会好的。但事实并非如此。
要查看编译器派生的类型(superclass),只需省略显式类型签名。然后,在GHCi中定义函数后,询问
Ord
sqrt
位于Floating
,/
位于Fractional
,Floating
位于Fractional
。但是~> :i sqrt
class Fractional a => Floating a where
...
sqrt :: a -> a
...
~> :i /
class Num a => Fractional a where
(/) :: a -> a -> a
...
infixl 7 /
~> :i <
class Eq a => Ord a where
...
(<) :: a -> a -> Bool
...
infix 4 <
是{{1}}的子类,所以单独指定它就足够了它们:
{{1}}