Haskell继承:它有什么特殊之处?

10
在“http://en.wikibooks.org/wiki/Haskell/Classes_and_types”的Class inheritance部分中,我读到“一个类可以从其他几个类继承:只需将所有祖先类放在=>之前的括号中。”
当"(...)=>"被描述为“继承”时,我感到困惑。就我所看到的,它只是一个类约束条件。它仅仅表示这个新定义的类(在例子中为Real)适用于已经是列出的类(Num和Ord)成员(具有实例的类型)。
简而言之,"(...)=>" 对于这个类的实例可能创建的类型所需要的特质起到了过滤器的作用,不会增强类或其实例。
我是否遗漏了什么?"(...)=>" 是否以某种方式从“父级”传递一些东西到“子级”?

5
在Java中,如果我写下interface A extends B { ... },这意味着任何A都必须是B的一种,也就是说A继承了B所有的属性和方法。 - Tom Crockett
3
谢谢您的评论。在Java术语中,“接口继承”和“实现继承”有明确的区别。在您的回答中,我认为您指出了(...)=> 对应于“接口继承”(即:要求的继承)。但是,我不同意将其描述为“A继承了B的能力”,因为这让我觉得这是实现继承,而Java的“extends”不会执行这种操作,我相信Haskell的 => 也不会执行,尽管我想不出如何测试这一点。 - gwideman
5
实际上,Haskell 中两种都可以找到!"接口继承" 对应于在类声明前面放置限制条件。例如,class Eq a => Ord a where ... 表示如果一种类型是可排序的,则它也必须具有相等关系--这是对任何可能的 Ord 实例施加的要求。 "实现继承" 对应于在一个 instance 声明前放置限制条件。例如,instance Monad m => Applicative (WrappedMonad m) 使用 Monad 的_功能_ 来实现 Applicative 的_要求_。 - Tom Crockett
你会发现Haskell在描述OO使用interface的情况时使用了class这个词,因此当应用于Haskell类时,继承这个词对应于OO概念中的接口继承。 - AndrewC
3
“inherity”让我微笑,顺便说一句,这是一个很棒的形容词化。 - AndrewC
1
@AndrewC “class ~= interface”。是的,当然我知道,只是还没有将其概括到这种情况……毫无疑问,这是因为我时常在使用的语言中‘class’具有另一层含义所导致的分心。唉! - gwideman
2个回答

15

实际上,这意味着子类的所有成员必须提供超类的所有方法。

因此,如链接示例中所示,我们可以编写一个需要Eq的方法,但只给它Ord约束,并且Eq方法被隐含地为我们提供。

(请注意,继承可能是这个术语的糟糕用法,因为它带有许多在我们的上下文中没有意义的联想。尽管如此,我认为我最好解释一下。)


4
在这个回答和@pelotom的回答之间,我觉得我已经很满意了:“继承”在这里指的是这个新类通过一个实例继承了加入(通过成员资格)提到的类的要求。因此确实像Java中的接口继承。 - gwideman

1

稍后回复,@gwideman,我认为你最初的理解是正确的。

简而言之,“(...)=>”对我来说似乎像是过滤器,用于要求创建此类实例的类型的特性,并且不会增加类或其实例

该维基页面的“类继承”是错误的。这是我的理由。 在页面上,它说:

这里,它意味着要使类型成为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的MINIMAL pragmas)

(...)=>是类型类约束,而不是Java式的接口继承。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接