Наследование Haskell: Какое у него свойство?

Здесь http://en.wikibooks.org/wiki/Haskell/Classes_and_types в разделе Наследование класса, я прочитал "Класс может наследовать от нескольких других классов: просто поместите все классы-предки в круглые скобки до того, как = > ".

Я озадачен, когда "(...) = > " описывается как "наследование". Насколько я вижу, это просто ограничение класса. Он просто говорит, что этот новый определенный класс (в примере: Real) применяется к типам, которые уже являются членами (имеют экземпляры) для перечисленных классов (Num и Ord).

Короче говоря, "(...) = > " мне кажется, что он действует как фильтр для качеств, необходимых для типов, для которых могут создаваться экземпляры этого класса, и не действует для увеличения класса или его экземпляры.

Я что-то упустил? Есть ли смысл в том, что "(...) = > " фактически передает что-то от "родителя" к "ребенку"?

Ответ 1

На практике это означает, что все члены подкласса обязательно предоставляют все методы суперкласса.

Итак, как и в связанном примере, мы можем написать метод, который требует Eq, но только присваивает ему ограничение Ord, и для нас подразумеваются методы Eq.

(Обратите внимание, что наследование, вероятно, является ужасным термином для этого, потому что оно несет в себе множество ассоциаций, которые не имеют смысла в нашем контексте. Тем не менее, я подумал, что я мог бы также объяснить это.)

Ответ 2

Позже ответ, @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 для объяснения "МИНИМАЛЬНЫЙ"

посмотрите на " МИНИМАЛЬНЫЙ ", он говорит, что экземпляру Ord нужно только реализовать сравнение или (<=), что означает, что вам не нужно "реализовывать операции == и /=". только то, что полиморфное "а" необходимо для реализации == Or/= (проверьте Eq MINIMAL прагмы)

(...) => это ограничение класса типа, а не Java как наследование интерфейса.