Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π˜Π·ΡƒΡ‡Π°ΠΉ Haskell Π²ΠΎ имя Π΄ΠΎΠ±Ρ€Π°!Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 34

Автор ΠœΠΈΡ€Π°Π½ Π›ΠΈΠΏΠΎΠ²Π°Ρ‡Π°

«ВнутрСнности» класса Eq

Π’ΠΎΠ·ΡŒΠΌΡ‘ΠΌ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° класс Ρ‚ΠΈΠΏΠΎΠ² Eq: ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ Π½Π΅ΠΊΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π° равСнство. Он опрСдСляСт ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ == ΠΈ /=. Если Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ, скаТСм, Car (Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒ), ΠΈ сравнСниС Π΄Π²ΡƒΡ… Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ == ΠΈΠΌΠ΅Π΅Ρ‚ смысл, Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ для Ρ‚ΠΈΠΏΠ° Car экзСмпляр класса Eq.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ класс Eq ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π² стандартном ΠΌΠΎΠ΄ΡƒΠ»Π΅:

class Eq a where

    (==) :: a –> a –> Bool

    (/=) :: a –> a –> Bool

    x == y = not (x /= y)

    x /= y = not (x == y)

О-Ρ…ΠΎ-Ρ…ΠΎ!.. Новый синтаксис ΠΈ Π½ΠΎΠ²Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова. НС Π±Π΅ΡΠΏΠΎΠΊΠΎΠΉΡ‚Π΅ΡΡŒ, скоро ΠΌΡ‹ это поясним. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, ΠΌΡ‹ записали Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡŽ class Eq a where – это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ опрСдСляСм Π½ΠΎΠ²Ρ‹ΠΉ класс, имя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Eq. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ a – это пСрСмСнная Ρ‚ΠΈΠΏΠ°; ΠΈΠ½Ρ‹ΠΌΠΈ словами, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈΠ³Ρ€Π°Π΅Ρ‚ Ρ€ΠΎΠ»ΡŒ Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² дальнСйшСм Π±ΡƒΠ΄Π΅Ρ‚ экзСмпляром нашСго класса. Π­Ρ‚Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ a; ΠΏΡƒΡΡ‚ΡŒ Π΄Π°ΠΆΠ΅ имя Π½Π΅ состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹, Π½ΠΎ ΠΎΠ½ΠΎ Π½Π΅ΠΏΡ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с символа Π² Π½ΠΈΠΆΠ½Π΅ΠΌ рСгистрС. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ опрСдСляСм нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. НСт нСобходимости ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ – достаточно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ°.

НСкоторым Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ эту Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡŽ, Ссли ΠΌΡ‹ запишСм class Eq equatable where, Π° Π·Π°Ρ‚Π΅ΠΌ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ (==) :: equatable –> equatable –> Bool.

ΠœΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² классС Eq, ΠΏΡ€ΠΈΡ‚ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΠΈΡ… Π²Π·Π°ΠΈΠΌΠ½ΠΎ рСкурсивно. ΠœΡ‹ записали, Ρ‡Ρ‚ΠΎ Π΄Π²Π° экзСмпляра класса Eq Ρ€Π°Π²Π½Ρ‹, Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ, ΠΈ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ, Ссли Π½Π΅ Ρ€Π°Π²Π½Ρ‹. ΠΠ΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ, ΠΈ всё ΠΆΠ΅ скоро ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Π΅ΠΌ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ.

Если Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡŽ class Eq a where, ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π½Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: (==) :: a -> a -> Bool, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ объявлСниС этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ: (Eq a) => a –> a –> Bool.

Π’ΠΈΠΏ для прСдставлСния свСтофора

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с классом послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ объявили Π΅Π³ΠΎ? Π’Π΅ΡΡŒΠΌΠ° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎΠ΅. Но ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ Π½Π°Ρ‡Π½Ρ‘ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ экзСмпляры этого класса, Ρ‚ΠΎ станСм ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ интСрСсныС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° этот Ρ‚ΠΈΠΏ:

data TrafficLight = Red | Yellow | Green

Он опрСдСляСт состояниС свСтофора. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ классов для Π½Π΅Π³ΠΎ. ΠœΡ‹ собираСмся Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Π΄Π°ΠΆΠ΅ нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ автоматичСски, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ экзСмпляры для классов Eq ΠΈ Show. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΌΡ‹ создадим экзСмпляр для класса Eq.

instance Eq TrafficLight where

   Red == Red = True

   Green == Green = True

   Yellow == Yellow = True

   _ == _ = False



ЭкзСмпляр создан с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова instance. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово class слуТит для опрСдСлСния Π½ΠΎΠ²Ρ‹Ρ… классов Ρ‚ΠΈΠΏΠΎΠ², Π° ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово instance – для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ для нашСго Ρ‚ΠΈΠΏΠ° экзСмпляр Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ класса. Когда ΠΌΡ‹ опрСдСляли класс Eq, Ρ‚ΠΎ записали Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡŽ class Eq a where ΠΈ сказали, Ρ‡Ρ‚ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ a ΠΈΠ³Ρ€Π°Π΅Ρ‚ Ρ€ΠΎΠ»ΡŒ Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ экзСмпляром класса. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ это ясно Π²ΠΈΠ΄ΠΈΠΌ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ создаём экзСмпляр, Ρ‚ΠΎ пишСм: instance Eq TrafficLight where. ΠœΡ‹ Π·Π°ΠΌΠ΅Π½ΠΈΠ»ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° Π½Π°Π·Π²Π°Π½ΠΈΠ΅ нашСго Ρ‚ΠΈΠΏΠ°.

Π’Π°ΠΊ ΠΊΠ°ΠΊ опСрация == Π±Ρ‹Π»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² объявлСнии класса Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Π·ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ /= ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, слСдуСт ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² объявлСнии экзСмпляра класса. Π­Ρ‚ΠΎ называСтся ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΠ»Π½Ρ‹ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ класса Ρ‚ΠΈΠΏΠΎΠ² – имССтся Π² Π²ΠΈΠ΄Ρƒ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π΄ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ наш Ρ‚ΠΈΠΏ ΠΌΠΎΠ³ вСсти сСбя Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ прСдписано классом. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ минимально ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ для класса Eq, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ==, ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ /=. Если Π±Ρ‹ класс Eq Π±Ρ‹Π» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

class Eq a where

    (==) :: a –> a –> Bool

    (/=) :: a –> a –> Bool

Ρ‚ΠΎ Π½Π°ΠΌ Π±Ρ‹ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ±Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈ создании экзСмпляра, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ язык Haskell Π½Π΅ Π·Π½Π°Π» Π±Ρ‹, ΠΊΠ°ΠΊ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ взаимосвязаны. Π’ этом случаС минимально ΠΏΠΎΠ»Π½Ρ‹ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π±Ρ‹Π»ΠΈ Π±Ρ‹ ΠΎΠ±Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, == ΠΈ /=.

ΠœΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ == с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сопоставлСния с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ Π΄Π²ΡƒΡ… Π½Π΅Ρ€Π°Π²Π½Ρ‹Ρ… Ρ†Π²Π΅Ρ‚ΠΎΠ² Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ большС, Ρ‡Π΅ΠΌ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ Ρ€Π°Π²Π½Ρ‹Ρ…, ΠΌΡ‹ пСрСчислили всС Ρ€Π°Π²Π½Ρ‹Π΅ Ρ†Π²Π΅Ρ‚Π° ΠΈ Π·Π°Ρ‚Π΅ΠΌ использовали маску подстановки, которая Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Ссли Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠ² Π½Π΅ ΠΏΠΎΠ΄ΠΎΡˆΡ‘Π», Ρ‚ΠΎ Π΄Π²Π° Ρ†Π²Π΅Ρ‚Π° Π½Π΅ Ρ€Π°Π²Π½Ρ‹.

Π”Π°Π²Π°ΠΉΡ‚Π΅ сдСлаСм для нашСго Ρ‚ΠΈΠΏΠ° экзСмпляр класса Show. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ минимально ΠΏΠΎΠ»Π½ΠΎΠΌΡƒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ для класса Show, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ show, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку:

instance Show TrafficLight where

   show Red = "ΠšΡ€Π°ΡΠ½Ρ‹ΠΉ свСт"

   show Yellow = "Π–Ρ‘Π»Ρ‚Ρ‹ΠΉ свСт"

   show Green = "Π—Π΅Π»Ρ‘Π½Ρ‹ΠΉ свСт"

ΠœΡ‹ снова использовали сопоставлСниС с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ нашСй Ρ†Π΅Π»ΠΈ. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ это всё Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚:

ghci> Red == Red

True

ghci> Red == Yellow

False

ghci> Red `elem` [Red, Yellow, Green]

True

ghci> [Red, Yellow, Green]

[ΠšΡ€Π°ΡΠ½Ρ‹ΠΉ свСт,Π–Ρ‘Π»Ρ‚Ρ‹ΠΉ свСт,Π—Π΅Π»Ρ‘Π½Ρ‹ΠΉ свСт]

МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ просто автоматичСски ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ экзСмпляр для класса Eq с Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Ρ‚Π΅ΠΌ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ (ΠΌΡ‹ этого Π½Π΅ сдСлали Π² ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… цСлях). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, автоматичСская гСнСрация для класса Show просто Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠ»Π° Π±Ρ‹ конструкторы Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² строки. Если Π½Π°ΠΌ трСбуСтся ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚ΠΎ придётся ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ экзСмпляр класса Show Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

НаслСдованиС классов

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ классы Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ подклассами Π΄Ρ€ΡƒΠ³ΠΈΡ… классов Ρ‚ΠΈΠΏΠΎΠ². ДСкларация класса Num довольно Π΄Π»ΠΈΠ½Π½Π°, Π½ΠΎ Π²ΠΎΡ‚ Π΅Ρ‘ Π½Π°Ρ‡Π°Π»ΠΎ:

class (Eq a) => Num a where

   ...

Как ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Ρ€Π°Π½Π΅Π΅, Π΅ΡΡ‚ΡŒ мноТСство мСст, ΠΊΡƒΠ΄Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‚ΠΈΡΠ½ΡƒΡ‚ΡŒ ограничСния Π½Π° класс. Наша запись Ρ€Π°Π²Π½ΠΎΠ·Π½Π°Ρ‡Π½Π° записи class Num a where, Π½ΠΎ ΠΌΡ‹ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΈΠΏ a ΠΈΠΌΠ΅Π» экзСмпляр класса Eq. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ для нашСго Ρ‚ΠΈΠΏΠ° экзСмпляр класса Eq Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ смоТСм ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ для Π½Π΅Π³ΠΎ экзСмпляр класса Num. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΠΈΠΏ смоТСт Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ число, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ значСния этого Ρ‚ΠΈΠΏΠ° Π½Π° равСнство.

Ну Π²ΠΎΡ‚ ΠΈ всё, Ρ‡Ρ‚ΠΎ Π½Π°Π΄ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ наслСдованиС, – это просто ограничСния Π½Π° класс Ρ‚ΠΈΠΏΠ°-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΡ€ΠΈ объявлСнии класса. ΠŸΡ€ΠΈ написании Ρ‚Π΅Π» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ класса ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π² экзСмплярС класса ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ a ΠΈΠΌΠ΅Π΅Ρ‚ экзСмпляр для класса Eq ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, допускаСтся использованиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² == ΠΈ /= со значСниями этого Ρ‚ΠΈΠΏΠ°.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ экзСмпляров классов для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²

Но ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ Maybe ΠΈ списковый Ρ‚ΠΈΠΏ сдСланы экзСмплярами классов? Π’ΠΈΠΏ Maybe отличаСтся, скаТСм, ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° TrafficLight Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Maybe сам ΠΏΠΎ сСбС Π½Π΅ являСтся ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ – это конструктор Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΈΠΏ-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Char), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ (ΠΊΠ°ΠΊ Maybe Char). Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° класс Eq Π΅Ρ‰Ρ‘ Ρ€Π°Π·:

class Eq a where

   (==) :: a –> a –> Bool

   (/=) :: a –> a –> Bool

   x == y = not (x /= y)

   x /= y = not (x == y)

Из Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ° ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ a ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ всС Ρ‚ΠΈΠΏΡ‹ Π² функциях Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌΠΈ (ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, ΠΌΡ‹ обсуТдали, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ‚ΠΈΠΏΠ° a –> Maybe, Π½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ – Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ‚ΠΈΠΏΠ°: a –> Maybe a ΠΈΠ»ΠΈ Maybe Int –> Maybe String). Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ нСдопустимо Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² Ρ‚Π°ΠΊΠΎΠΌ Ρ€ΠΎΠ΄Π΅:

instance Eq Maybe where

   ...

Π’Π΅Π΄ΡŒ, ΠΊΠ°ΠΊ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ a Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Π° Ρ‚ΠΈΠΏ Maybe Π½Π΅ являСтся Ρ‚Π°ΠΊΠΎΠ²Ρ‹ΠΌ. Π­Ρ‚ΠΎ конструктор Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ.

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ скучно ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ instance Eq (Maybe Int) where, instance Eq (Maybe Char) where ΠΈ Ρ‚. Π΄. для всСх ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ². Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ это Ρ‚Π°ΠΊ:

instance Eq (Maybe m) where

   Just x == Just y = x == y

   Nothing == Nothing = True

   _ == _ = False

Π­Ρ‚ΠΎ всё Ρ€Π°Π²Π½ΠΎ Ρ‡Ρ‚ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ для всСх Ρ‚ΠΈΠΏΠΎΠ² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Maybe <Π½Π΅Ρ‡Ρ‚ΠΎ> экзСмпляр класса Eq. ΠœΡ‹ Π΄Π°ΠΆΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ (Maybe something), Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ программисты ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Π΅ Π±ΡƒΠΊΠ²Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ стиля языка Haskell. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (Maybe m) выступаСт Π² качСствС Ρ‚ΠΈΠΏΠ° a Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ class Eq a where. Π’ΠΈΠΏ Maybe Π½Π΅ являСтся ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ, Π° Maybe m – являСтся. Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° (m Π² Π½ΠΈΠΆΠ½Π΅ΠΌ рСгистрС) ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Ρ‚ΠΈΠΏΡ‹ Π²ΠΈΠ΄Π° Maybe m, Π³Π΄Π΅ m – любой Ρ‚ΠΈΠΏ, ΠΈΠΌΠ΅Π»ΠΈ экзСмпляры класса Eq.