2012-05-02 2 views
6

Мне было интересно узнать об объявлении экземпляра Ord для (a,b), и я хотел бы быстро просмотреть хакеры, чтобы подтвердить мою интуицию, что сравнение сначала на a, а затем, в случае равенства, на b. В частности я пошел here. Поскольку хакеры имеют ссылки на исходный код для деклараций и функций данных, я предположил, что также будет исходный код для деклараций экземпляра, но я не могу их найти. Есть ли причина, почему их там нет, или я просто не выглядел достаточно сложно? type Answer = Either Explanation Directions :)Исходный код для стандартных экземпляров экземпляра typeclass

+3

Существует открытый билет [добавить ссылки источника для экземпляров] (http://trac.haskell.org/haddock/ticket/145) в Haddock, что упростит поиск экземпляров. – hammar

+0

Большое спасибо. Все хорошие ответы, каждая из которых содержит немного дополнительной информации, которая делает их отличными от других. – Boris

ответ

4

Я пошел looking in the Prelude, нажал на source link for the Ord typeclass, прокручивать вниз немного, и обнаружил, что она определяется как

deriving instance (Ord a, Ord b) => Ord (a, b) 

Он использует расширение StandaloneDeriving. В основном это генерируя тот же код, как если бы тип был определен как

data (a, b) = (a, b) deriving Ord 
4

The Ord например, для кортежей is derived, в соответствии с правилами из спецификации языка, которая восходит as far as Gofer.

instance (Eq a, Eq b) => Eq (a,b) where 
    (x,y) == (u,v) = x==u && y==v 

instance (Ord a, Ord b) => Ord (a,b) where 
    (x,y) <= (u,v) = x<u || (x==u && y<=v) 
4

Haskell 98 определяет это in section 10.1:

методы класса автоматически введенных производных экземпляров уравнения и Ord являются (==), (/ =), сравните, (<) , (< =), (>), (> =), max и min. Последние семь операторов определены так, чтобы сравнить их аргументы лексикографически относительно установленного набора конструкторов, с более ранними конструкторами в объявлении типа данных, считая меньше, чем более поздние.

Производные сравнения всегда пересекают конструкторы слева направо.

...

Все производные операции класса уравнения и Ord являются строгими в обоих аргументов.

Смежные вопросы