无法证明Haskell中显式类型绑定错误中的约束

时间:2016-11-07 00:01:17

标签: haskell types

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

任何人都可以帮我解释一下吗?

2 个答案:

答案 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/位于FractionalFloating位于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}}