在Class继承部分{@ 3}}中,我读到“一个类可以从其他几个类继承:只需将所有祖先类放在=>之前的括号中。”
当“(...)=>”时我很困惑被描述为“继承”。据我所知,它只是一个类约束。它只是说这个新定义的类(在示例中为Real)适用于已经列出的类(Num和Ord)的成员(具有实例)的类型。
简而言之,“(...)=>”在我看来,对于可以创建此类的实例的类型所需的质量过滤器,并不起到增强类或其实例的作用。
我错过了什么吗?是否有某种意义上的“(...)=>”实际上从“父母”传递到“孩子”的东西?
答案 0 :(得分:15)
实际上,这意味着子类的所有成员都必须提供超类的所有方法。
因此,在链接示例中,我们可以编写一个需要Eq
的方法,但只给它一个Ord
约束,并且隐含Eq
方法。< / p>
(请注意,继承可能是一个可怕的术语,因为它带有许多在我们的上下文中没有意义的关联。尽管如此,我想我也可以解释它。)
答案 1 :(得分:0)
稍后回复,@ gwideman,我认为您的最初理解是正确的。
简而言之,“(...)=>”在我看来就像是可以为其创建此类实例的类型所要求的质量的过滤器,并且对任何一种都不起作用类或其实例
该Wiki页面的“类继承”是错误的。这是我的原因。 在页面上显示。
在这里,这意味着要使类型成为Ord的实例,它也必须是Eq的实例,因此需要实现==和/ =操作
如果您运行ghci,然后键入:info Ord ,则会显示以下信息:
class Eq a => Ord a where
compare :: a -> a -> Ordering
(<) :: a -> a -> Bool
(<=) :: a -> a -> Bool
(>) :: a -> a -> Bool
(>=) :: a -> a -> Bool
max :: a -> a -> a
min :: a -> a -> a
{-# MINIMAL compare | (<=) #-}
https://downloads.haskell.org/~ghc/7.8.1/docs/html/users_guide/pragmas.html,以解释“ MINIMAL”
看看“ MINIMAL ”,它说,Ord实例只需要实现compare 或(<=),这意味着您不需要“执行==和/ =操作”。 只是多态的'a'需要实现==或/ =(检查Eq的最小编译指示)
(...)=>是类型类约束,而不是Java之类的接口继承。