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

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

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

Однако здСсь Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Π—Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ? ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ == для содСрТимого Ρ‚ΠΈΠΏΠ° Maybe, Π½ΠΎ Ρƒ нас Π½Π΅Ρ‚ увСрСнности, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ содСрТит Ρ‚ΠΈΠΏ Maybe, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использовано с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ класса Eq. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡŽ экзСмпляра Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ:

instance (Eq m) => Eq (Maybe m) where

   Just x == Just y = x == y

   Nothing == Nothing = True

   _ == _ = False

Нам ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° класс. Π’Π°ΠΊΠΈΠΌ объявлСниСм экзСмпляра класса ΠΌΡ‹ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅ΠΌ: Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Ρ‚ΠΈΠΏΡ‹ Π²ΠΈΠ΄Π° Maybe m ΠΈΠΌΠ΅Π»ΠΈ экзСмпляр для класса Eq, Π½ΠΎ ΠΏΡ€ΠΈ этом Ρ‚ΠΈΠΏ m (Ρ‚ΠΎΡ‚, Ρ‡Ρ‚ΠΎ хранится Π² Maybe) Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ экзСмпляр класса Eq. Π’Π°ΠΊΠΎΠΉ ΠΆΠ΅ экзСмпляр ΠΏΠΎΡ€ΠΎΠ΄ΠΈΠ» Π±Ρ‹ сам язык Haskell, Ссли Π±Ρ‹ ΠΌΡ‹ воспользовались Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ deriving.

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ограничСния Π½Π° класс Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ класса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ класс подклассом Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ класса. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ Π½Π° класс Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ экзСмпляра ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ трСбования ΠΊ содСрТимому Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. НапримСр, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΌΡ‹ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ содСрТимоС Ρ‚ΠΈΠΏΠ° Maybe Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π»ΠΎ экзСмпляр для класса Eq.

ΠŸΡ€ΠΈ создании экзСмпляров, Ссли Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ использовался ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, a –> a –> Bool), Π° Π²Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚Π΅ экзСмпляр для конструктора Ρ‚ΠΈΠΏΠΎΠ², слСдуСт ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ скобки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ.

ΠŸΡ€ΠΈΠΌΠΈΡ‚Π΅ Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ, экзСмпляр для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ, Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ класса. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ a ΠΈΠ· Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ class Eq a where Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΌΠ΅Π½Ρ‘Π½ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΏΡ€ΠΈ создании экзСмпляра; ΠΏΠΎΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ Π² ΡƒΠΌΠ΅ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ Π² дСкларациях Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π‘ΠΈΠ³Π½Π°Ρ‚ΡƒΡ€Π° (==) :: Maybe –> Maybe –> Bool Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ смысла, Π½ΠΎ сигнатура (==) :: (Eq m) => Maybe m –> Maybe m –> Bool ΠΈΠΌΠ΅Π΅Ρ‚. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, это Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для упраТнСния, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ == всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ (==) :: (Eq a) => a –> a –> Bool нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ экзСмпляры ΠΌΡ‹ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌ.

О, ΠΈ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½Π° классная Ρ„ΠΈΡˆΠΊΠ°! Если Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ экзСмпляры ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ для класса Ρ‚ΠΈΠΏΠΎΠ², Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ : info Π² GHCi. НапримСр, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ :info Num, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΊΠ°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² этом классС Ρ‚ΠΈΠΏΠΎΠ², ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚Π΅ список ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… классу Ρ‚ΠΈΠΏΠΎΠ². Команда :info Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΈ конструкторами Ρ‚ΠΈΠΏΠΎΠ². Если Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ :info Maybe, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ всС классы Ρ‚ΠΈΠΏΠΎΠ², ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ относится Ρ‚ΠΈΠΏ Maybe. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

ghci> :info Maybe

data Maybe a = Nothing | Just a -- Defined in Data.Maybe

instance Eq a => Eq (Maybe a) -- Defined in Data.Maybe

instance Monad Maybe -- Defined in Data.Maybe

instance Functor Maybe -- Defined in Data.Maybe

instance Ord a => Ord (Maybe a) -- Defined in Data.Maybe

instance Read a => Read (Maybe a) -- Defined in GHC.Read

instance Show a => Show (Maybe a) -- Defined in GHC.Show

Класс Ρ‚ΠΈΠΏΠΎΠ² «да–нСт»

Π’ языкС JavaScript ΠΈ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… слабо Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… языках Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ if практичСски Π»ΡŽΠ±Ρ‹Π΅ выраТСния. НапримСр, всС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ выраТСния ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅:

if (0) alert("ДА!") else alert("НЕВ!")


if ("") alert ("ДА!") else alert("НЕВ!")


if (false) alert("ДА!") else alert("НЕВ!)

ΠΈ всС ΠΎΠ½ΠΈ ΠΏΠΎΠΊΠ°ΠΆΡƒΡ‚ НЕВ!".

Если Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ

if ("ЧВО") alert ("ДА!") else alert("НЕВ!")

ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ "ДА!", Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ язык JavaScript рассматриваСт нСпустыС строки ΠΊΠ°ΠΊ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ истинного значСния.



НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ строгоС использованиС Ρ‚ΠΈΠΏΠ° Bool для булСвских Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ являСтся прСимущСством языка Haskell, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΎΡΡ‚ΠΎ для Π·Π°Π±Π°Π²Ρ‹. Начнём с Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ класса:

class YesNo a where

   yesno :: a –> Bool

Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ просто. Класс Ρ‚ΠΈΠΏΠΎΠ² YesNo опрСдСляСт ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄. Π­Ρ‚Π° функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Ρ…Ρ€Π°Π½ΠΈΡ‚Π΅Π»ΡŒ Π½Π΅ΠΊΠΎΠ΅ΠΉ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ истинности; функция Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Π½Π°ΠΌ, истинно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ использовали ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ a Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, слСдуСт, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ нСсколько экзСмпляров. Для чисСл, Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Π² языкС JavaScript, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ любоС Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ истинно, Π° Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ – Π»ΠΎΠΆΠ½ΠΎ.

instance YesNo Int where

   yesno 0 = False

   yesno _ = True

ΠŸΡƒΡΡ‚Ρ‹Π΅ списки (ΠΈ, соотвСтствСнно, строки) ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΠΈ Π»ΠΎΠΆΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅; Π½Π΅ пустыС списки истинны.

instance YesNo [a] where

   yesno [] = False

   yesno _ = True

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ записали Ρ‚ΠΈΠΏ-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ список ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ, Π½ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π»ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎ Ρ‚ΠΈΠΏΠ΅, Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΌ Π² спискС. Π§Ρ‚ΠΎ Π΅Ρ‰Ρ‘? Π“ΠΌ-м… Π― знаю, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ Bool Ρ‚Π°ΠΊΠΆΠ΅ содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± истинности ΠΈΠ»ΠΈ лоТности, ΠΈ сообщаСт ΠΎΠ± этом довольно нСдвусмыслСнно:

instance YesNo Bool where

   yesno = id

Π§Ρ‚ΠΎ? КакоС id?.. Π­Ρ‚ΠΎ стандартная библиотСчная функция, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈ Π΅Π³ΠΎ ΠΆΠ΅ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚. ΠœΡ‹ всё Ρ€Π°Π²Π½ΠΎ записали Π±Ρ‹ Ρ‚ΠΎ ΠΆΠ΅ самоС. Π‘Π΄Π΅Π»Π°Π΅ΠΌ экзСмпляр для Ρ‚ΠΈΠΏΠ° Maybe:

instance YesNo (Maybe a) where

   yesno (Just _) = True

   yesno Nothing = False

Нам Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° класс ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ Π΄Π΅Π»Π°Π΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎ содСрТимом Ρ‚ΠΈΠΏΠ° Maybe. ΠœΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ истинСн для всСх Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Just ΠΈ Π»ΠΎΠΆΠ΅Π½ для значСния Nothing. Нам приходится ΠΏΠΈΡΠ°Ρ‚ΡŒ (Maybe a) вмСсто просто Maybe, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ, Ссли ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Maybe –> Bool, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Maybe – Π½Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ; Π·Π°Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ функция Maybe a –> Bool. ΠšΡ€ΡƒΡ‚ΠΎ – любой Ρ‚ΠΈΠΏ Π²ΠΈΠ΄Π° Maybe <Π½Π΅Ρ‡Ρ‚ΠΎ> являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ YesNo нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ прСдставляСт собой это Β«Π½Π΅Ρ‡Ρ‚ΠΎΒ»!

Π Π°Π½Π΅Π΅ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏ Tree для прСдставлСния Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поискового Π΄Π΅Ρ€Π΅Π²Π°. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ пустоС Π΄Π΅Ρ€Π΅Π²ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΎΠΌ Π»ΠΎΠΆΠ½ΠΎΠ³ΠΎ значСния, Π° Π½Π΅ пустоС – истинного.

instance YesNo (Tree a) where

   yesno EmptyTree = False

   yesno _ = True

Π•ΡΡ‚ΡŒ Π»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈ истинности ΠΈ лоТности Ρƒ Ρ†Π²Π΅Ρ‚ΠΎΠ² свСтофора? ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ. Если Ρ†Π²Π΅Ρ‚ красный, Π²Ρ‹ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚Π΅ΡΡŒ. Если Π·Π΅Π»Ρ‘Π½Ρ‹ΠΉ – ΠΈΠ΄Ρ‘Ρ‚Π΅. Ну Π° Ссли ΠΆΡ‘Π»Ρ‚Ρ‹ΠΉ? Ну, я ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π±Π΅Π³Ρƒ Π½Π° ΠΆΡ‘Π»Ρ‚Ρ‹ΠΉ: ΠΆΠΈΡ‚ΡŒ Π½Π΅ ΠΌΠΎΠ³Ρƒ Π±Π΅Π· Π°Π΄Ρ€Π΅Π½Π°Π»ΠΈΠ½Π°!

instance YesNo TrafficLight where

   yesno Red = False

   yesno _ = True

Ну Ρ‡Ρ‚ΠΎ ΠΆ, ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ нСсколько экзСмпляров, Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΈΠ³Ρ€Π°Π΅ΠΌ с Π½ΠΈΠΌΠΈ:

ghci> yesno $ length []

False

ghci> yesno "Ρ…Π°-Ρ…Π°"

True

ghci> yesno ""

False

ghci> yesno $ Just 0

True

ghci> yesno True

True

ghci> yesno EmptyTree

False

ghci> yesno []

False

ghci> yesno [0,0,0]

True

ghci> :t yesno

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

Π’Π°-Π°ΠΊ, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π’Π΅ΠΏΠ΅Ρ€ΡŒ сдСлаСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ if, Π½ΠΎ со значСниями Ρ‚ΠΈΠΏΠΎΠ², для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ экзСмпляр класса YesNo:

yesnoIf :: (YesNo y) => y –> a –> a –> a

yesnoIf yesnoVal yesResult noResult =

     if yesno yesnoVal

         then yesResult

         else noResult

Всё довольно ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ. Ѐункция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для опрСдСлСния истинности ΠΈ Π΄Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ истинно, возвращаСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€; Ссли Π½Π΅Ρ‚ – Π²Ρ‚ΠΎΡ€ΠΎΠΉ.

ghci> yesnoIf [] "ДА!" "НЕВ!"

"НЕВ!"

ghci> yesnoIf [2,3,4] "ДА!" "НЕВ!"

"ДА!"

ghci> yesnoIf True "ДА!" "НЕВ!"

"ДА!"

ghci> yesnoIf (Just 500) "ДА!" "НЕВ!"

"ДА!"

ghci> yesnoIf Nothing "ДА!" НЕВ!"

НЕВ!"

Класс Ρ‚ΠΈΠΏΠΎΠ² Functor

ΠœΡ‹ ΡƒΠΆΠ΅ встрСчали мноТСство классов Ρ‚ΠΈΠΏΠΎΠ² ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Ознакомились с классом Ord, прСдусмотрСнным для сущностСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΡ‚ΡŒ. Π’Π΄ΠΎΠ²ΠΎΠ»ΡŒ набаловались с классом Eq, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌ для сравнСния Π½Π° равСнство. Π˜Π·ΡƒΡ‡ΠΈΠ»ΠΈ класс Show, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ интСрфСйс для Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ строк. Наш Π΄ΠΎΠ±Ρ€Ρ‹ΠΉ Π΄Ρ€ΡƒΠ³ класс Read ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ строку Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Ну Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ приступим ΠΊ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ класса Ρ‚ΠΈΠΏΠΎΠ² Functor, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ для Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Ρ‹ Π΄Ρ€ΡƒΠ³ Π² Π΄Ρ€ΡƒΠ³Π°.



Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹ ΠΏΠΎΠ΄ΡƒΠΌΠ°Π»ΠΈ ΠΎ списках: вСдь ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ списков – это ΠΎΡ‡Π΅Π½ΡŒ распространённая ΠΈΠ΄ΠΈΠΎΠΌΠ° Π² языкС Haskell. И Π²Ρ‹ ΠΏΡ€Π°Π²Ρ‹: списковый Ρ‚ΠΈΠΏ ΠΈΠΌΠ΅Π΅Ρ‚ экзСмпляр для класса Functor.

НСт Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ способа ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ класс Ρ‚ΠΈΠΏΠΎΠ² Functor, Ρ‡Π΅ΠΌ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½. Π’ΠΎΡ‚ ΠΈ посмотрим:

fmap :: (a -> b) -> f a -> f b

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Ρƒ нас имССтся? Класс опрСдСляСт ΠΎΠ΄Π½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ fmap ΠΈ Π½Π΅ прСдоставляСт для Π½Π΅Ρ‘ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π’ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fmap вСсьма интСрСсСн. Π’ΠΎ всСх Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹Ρ… опрСдСлСниях классов Ρ‚ΠΈΠΏΠΎΠ² Ρ‚ΠΈΠΏ-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΈΠ³Ρ€Π°Π²ΡˆΠΈΠΉ Ρ€ΠΎΠ»ΡŒ Ρ‚ΠΈΠΏΠ° Π² классС, Π±Ρ‹Π» Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΊΠ°ΠΊ пСрСмСнная a Π² сигнатурС (==) :: (Eq a) => a –> a –> Bool. Но Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‚ΠΈΠΏ-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ f Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° (Π½Π΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ пСрСмСнная, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Int, Bool ΠΈΠ»ΠΈ Maybe String); Π² этом случаС пСрСмСнная – конструктор Ρ‚ΠΈΠΏΠΎΠ², ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. (Напомню: Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Maybe Int являСтся ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ, Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Maybe – конструктор Ρ‚ΠΈΠΏΠΎΠ² с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ.) ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ функция fmap ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΈ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€, ΠΏΡ€ΠΈΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹ΠΉ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€, ΠΏΡ€ΠΈΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹ΠΉ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ.