10

http://en.wikibooks.org/wiki/Haskell/Classes_and_types部分类继承中,我读到“一个类可以从其他几个类继承:只需将所有祖先类放在 => 之前的括号中。”

当“(...)=>”被描述为“继承”时,我感到很困惑。据我所知,这只是一个类约束。它只是说这个新定义的类(在示例中:Real)适用于已经是列出的类(Num 和 Ord)的成员(具有实例)的类型。

简而言之,“(...)=>”在我看来就像一个过滤器,用于筛选可以创建此类实例的类型所需的质量,并且不会增强类或其实例。

我错过了什么吗?“(...)=>”实际上将某些东西从“父母”传递给“孩子”是否有某种意义?

4

2 回答 2

15

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

因此,就像在链接的示例中一样,我们可以编写一个 requires 的方法Eq,但只给它一个Ord约束,并且这些Eq方法对我们来说是隐含的。

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

于 2013-02-07T02:59:19.830 回答
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 的实例只需要实现比较(<=),这意味着,您不需要“实现 == 和 /= 操作”。只有多态 'a' 需要实现 == 或 /= (检查 Eq 的 MINIMAL pragmas)

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

于 2019-02-04T23:20:05.740 回答