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

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

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

data Day = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday

  deriving (Eq, Ord, Show, Read, Bounded, Enum)

Π’Π°ΠΊ ΠΊΠ°ΠΊ для нашСго Ρ‚ΠΈΠΏΠ° автоматичСски сгСнСрированы экзСмпляры классов Show ΠΈ Read, ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ значСния Ρ‚ΠΈΠΏΠ° Π² строки ΠΈ ΠΈΠ· строк:

ghci> Wednesday

Wednesday

ghci> show Wednesday

"Wednesday"

ghci> read "Saturday" :: Day

Saturday

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ экзСмпляры классов Eq ΠΈ Ord, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ сравнСниС ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° равСнство:

ghci> Saturday == Sunday

False

ghci> Saturday == Saturday

True

ghci> Saturday > Friday

True

ghci> Monday `compare` Wednesday

LT

Наш Ρ‚ΠΈΠΏ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ экзСмпляр класса Bounded, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΉΡ‚ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ дСнь.

ghci> minBound :: Day

Monday

ghci> maxBound :: Day

Sunday

Благодаря Ρ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ ΠΈΠΌΠ΅Π΅Ρ‚ экзСмпляр класса Enum, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π½ΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ Π΄Π½Π΅ΠΉ.

ghci> succ Monday

Tuesday

ghci> pred Saturday

Friday

ghci> [Thursday .. Sunday]

[Thursday,Friday,Saturday,Sunday]

ghci> [minBound .. maxBound] :: [Day]

[Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday]

Π—Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ!

Π‘ΠΈΠ½ΠΎΠ½ΠΈΠΌΡ‹ Ρ‚ΠΈΠΏΠΎΠ²


Π Π°Π½Π΅Π΅ ΠΌΡ‹ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΡ‹ [Char] ΠΈ String ΡΠ²Π»ΡΡŽΡ‚ΡΡ эквивалСнтами ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²Π·Π°ΠΈΠΌΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ. Π­Ρ‚ΠΎ осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ синонимов Ρ‚ΠΈΠΏΠΎΠ². Π‘ΠΈΠ½ΠΎΠ½ΠΈΠΌ Ρ‚ΠΈΠΏΠ° сам ΠΏΠΎ сСбС Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ – ΠΎΠ½ просто Π΄Π°Ρ‘Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ имя ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ Ρ‚ΠΈΠΏΡƒ, облСгчая ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ нашСго ΠΊΠΎΠ΄Π° ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ. Π’ΠΎΡ‚ Ρ‚Π°ΠΊ стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° опрСдСляСт Ρ‚ΠΈΠΏ String ΠΊΠ°ΠΊ синоним для [Char]:

type String = [Char]

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово type ΠΌΠΎΠΆΠ΅Ρ‚ ввСсти Π² Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ ΠΌΡ‹ Π½Π΅ создаём Π½ΠΈΡ‡Π΅Π³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ (создаём ΠΌΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова data), Π° просто опрСдСляСм синоним для ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ°.

Если ΠΌΡ‹ создадим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строку Π² Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ рСгистр, ΠΈ Π½Π°Π·ΠΎΠ²Ρ‘ΠΌ Π΅Ρ‘ toUpperString, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π°Ρ‚ΡŒ Π΅ΠΉ сигнатуру Ρ‚ΠΈΠΏΠ° toUpperString :: [Char] –> [Char] ΠΈΠ»ΠΈ toUpperString :: String –> String. ОбС сигнатуры ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅, Π½ΠΎ вторая Π»Π΅Π³Ρ‡Π΅ читаСтся.

Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π½Π°Ρ тСлСфонная ΠΊΠ½ΠΈΠ³Π°

Когда ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ с ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ Data.Map, Ρ‚ΠΎ Π²Π½Π°Ρ‡Π°Π»Π΅ прСдставляли Π·Π°ΠΏΠΈΡΠ½ΡƒΡŽ ΠΊΠ½ΠΈΠΆΠΊΡƒ Π² Π²ΠΈΠ΄Π΅ ассоциативного списка, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π»ΠΈ Π΅Π³ΠΎ Π² ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Как ΠΌΡ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅ΠΌ, ассоциативный список – это список ΠΏΠ°Ρ€ Β«ΠΊΠ»ΡŽΡ‡β€“Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β». Π”Π°Π²Π°ΠΉΡ‚Π΅ взглянСм Π½Π° этот Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ записной ΠΊΠ½ΠΈΠΆΠΊΠΈ:

phoneBook :: [(String,String)]

phoneBook =

  [("оля","555–29-38")

  ,("ТСня","452–29-28")

  ,("катя","493–29-28")

  ,("маша","205–29-28")

  ,("надя","939–82-82")

  ,("юля","853–24-92")

  ]

ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ функция phoneBook ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ [(String,String)]. Π­Ρ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°ΠΌΠΈ ассоциативный список, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ строки Π² строки, – Π½ΠΎ Π½Π΅ Π±ΠΎΠ»Π΅Π΅. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π·Π°Π΄Π°Π΄ΠΈΠΌ синоним Ρ‚ΠΈΠΏΠ°, ΠΈ ΠΌΡ‹ смоТСм ΡƒΠ·Π½Π°Ρ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ большС ΠΏΠΎ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ°:

type PhoneBook = [(String,String)]

Π’Π΅ΠΏΠ΅Ρ€ΡŒ дСкларация Ρ‚ΠΈΠΏΠ° для нашСй записной ΠΊΠ½ΠΈΠΆΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ: phoneBook :: PhoneBook. Π—Π°Π΄Π°Π΄ΠΈΠΌ Ρ‚Π°ΠΊΠΆΠ΅ синоним для String.

type PhoneNumber = String

type Name = String

type PhoneBook = [(Name,PhoneNumber)]

Π’Π΅, ΠΊΡ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° языкС Haskell, Π΄Π°ΡŽΡ‚ синонимы Ρ‚ΠΈΠΏΡƒ String, Ссли хотят ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ объявлСния Π±ΠΎΠ»Π΅Π΅ «говорящими» – ΠΏΠΎΡΡΠ½ΠΈΡ‚ΡŒ, Ρ‡Π΅ΠΌ ΡΠ²Π»ΡΡŽΡ‚ΡΡ строки ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

Π˜Ρ‚Π°ΠΊ, рСализуя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ имя ΠΈ Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π° ΠΈ провСряСт, Π΅ΡΡ‚ΡŒ Π»ΠΈ такая комбинация Π² нашСй записной ΠΊΠ½ΠΈΠΆΠΊΠ΅, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π°Ρ‚ΡŒ Π΅ΠΉ ΠΊΡ€Π°ΡΠΈΠ²ΡƒΡŽ ΠΈ ΠΏΠΎΠ½ΡΡ‚Π½ΡƒΡŽ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠ°:

inPhoneBook :: Name –> PhoneNumber –> PhoneBook –> Bool

inPhoneBook name pnumber pbook = (name,pnumber) `elem` pbook

Если Π±Ρ‹ ΠΌΡ‹ Π½Π΅ использовали синонимы Ρ‚ΠΈΠΏΠΎΠ², Ρ‚ΠΈΠΏ нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Ρ‹Π» Π±Ρ‹ String –> String –> [(String,String)] –> Bool. Π’ этом случаС Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π»Π΅Π³Ρ‡Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ синонимов Ρ‚ΠΈΠΏΠΎΠ². Однако Π½Π΅ Π½Π°Π΄ΠΎ ΠΏΠ΅Ρ€Π΅Π³ΠΈΠ±Π°Ρ‚ΡŒ ΠΏΠ°Π»ΠΊΡƒ. ΠœΡ‹ примСняСм синонимы Ρ‚ΠΈΠΏΠΎΠ² для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Π² Π½Π°ΡˆΠΈΡ… функциях (Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² Π»ΡƒΡ‡ΡˆΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹), ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ с Π΄Π»ΠΈΠ½Π½ΠΎΠΉ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠ΅ΠΉ Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ приходится часто ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ (Π²Ρ€ΠΎΠ΄Π΅ [(String,String)]), ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ эта дСкларация ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ спСцифичноС Π² контСкстС Π½Π°ΡˆΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·Π°Ρ†ΠΈΡ синонимов

Π‘ΠΈΠ½ΠΎΠ½ΠΈΠΌΡ‹ Ρ‚ΠΈΠΏΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹. Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°Π΄Π°Ρ‚ΡŒ синоним для ассоциативного списка ΠΈ ΠΏΡ€ΠΈ этом Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΠΌΠΎΠ³ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ для ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

type AssocList k v = [(k,v)]

Ѐункция, которая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ Π² ассоциативном спискС, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ (Eq k) => k –> AssocList k v –> Maybe v. Π’ΠΈΠΏ AssocList – это конструктор Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ AssocList Int String.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ частично ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ; Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ частично ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚ΠΈΠΏΡ‹-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ конструкторы Ρ‚ΠΈΠΏΠΎΠ². Π’Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π½Π΅ пСрСдавая всСх ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ конструктор Ρ‚ΠΈΠΏΠ°, Π½Π΅ указывая всСх ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ частично ΠΏΡ€ΠΈΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹ΠΉ конструктор Ρ‚ΠΈΠΏΠ°. Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ для ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (ΠΈΠ· модуля Data.Map) с цСлочислСнными ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

type IntMap v = Map Int v

ΠΈΠ»ΠΈ Ρ‚Π°ΠΊ:

type IntMap = Map Int

Π’ любом случаС конструктор Ρ‚ΠΈΠΏΠΎΠ² IntMap ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ – это ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΈΠΏΠΎΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Int.

И Π²ΠΎΡ‚ Π΅Ρ‰Ρ‘ Ρ‡Ρ‚ΠΎ. Если Π²Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Π°ΠΌ потрСбуСтся произвСсти ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΈΠΌΠΏΠΎΡ€Ρ‚ модуля Data.Map. ΠŸΡ€ΠΈ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄ конструкторами Ρ‚ΠΈΠΏΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π΄ΠΎ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ имя модуля. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ Π±Ρ‹ записали: IntMap = Map.Map Int.

Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ конструкторами Ρ‚ΠΈΠΏΠΎΠ² ΠΈ конструкторами Π΄Π°Π½Π½Ρ‹Ρ…. Если ΠΌΡ‹ создали синоним Ρ‚ΠΈΠΏΠ° IntMap ΠΈΠ»ΠΈ AssocList, это Π΅Ρ‰Ρ‘ Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠ°ΠΊ AssocList [(1,2),(4,5),(7,9)]. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Ρ‚ΠΈΠΏ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ имя. МоТно Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ: [(1,2),(3,5),(8,9)] :: AssocList Int Int, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ числа Π² спискС Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Ρ†Π΅Π»Ρ‹Π΅ – Π½ΠΎ ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ смоТСм Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с этим списком ΠΊΠ°ΠΊ с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ списком ΠΏΠ°Ρ€ Ρ†Π΅Π»Ρ‹Ρ… чисСл. Π‘ΠΈΠ½ΠΎΠ½ΠΈΠΌΡ‹ Ρ‚ΠΈΠΏΠΎΠ² (ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Ρ‚ΠΈΠΏΡ‹) ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² языкС Haskell Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ объявлСнии Ρ‚ΠΈΠΏΠΎΠ². Π§Π°ΡΡ‚ΡŒ языка, относящаяся ΠΊ объявлСнию Ρ‚ΠΈΠΏΠΎΠ², – собствСнно объявлСниС Ρ‚ΠΈΠΏΠΎΠ² (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ‚ΠΈΠΏΠΎΠ²) ΠΈΠ»ΠΈ Ρ‡Π°ΡΡ‚ΡŒ объявлСния послС символа :: (Π΄Π²Π° двоСточия). Π‘ΠΈΠΌΠ²ΠΎΠ» :: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ»ΠΈ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ².

Иди Π½Π°Π»Π΅Π²ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²ΠΎ

Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ чудСсный Ρ‚ΠΈΠΏ, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ Π΄Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², – это Ρ‚ΠΈΠΏ Either. Он ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Π°ΠΊ:

data Either a b = Left a | Right b deriving (Eq, Ord, Read, Show)

Π£ Π½Π΅Π³ΠΎ Π΄Π²Π° конструктора Π΄Π°Π½Π½Ρ‹Ρ…. Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ конструктор Left, Π΅Π³ΠΎ содСрТимоС ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ a; Ссли Right – содСрТимоС ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ b. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ для инкапсуляции значСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π΄Π²ΡƒΡ… Ρ‚ΠΈΠΏΠΎΠ². Когда ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с Ρ‚ΠΈΠΏΠΎΠΌ Either a b, Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ сопоставлСниС с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ ΠΏΠΎ Left ΠΈ Right ΠΈ выполняСм дСйствия Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ совпал.

ghci> Right 20

Right 20

ghci> Left "Π²00Ρ‚"

Left "Π²00Ρ‚"

ghci> :t Right 'a'

Right 'a' :: Either a Char ghci> :t Left True

Left True :: Either Bool b

Из ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° слСдуСт, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΠΎΠΌ значСния Left True являСтся Either Bool b. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° Bool, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ создано конструктором Left; Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ остался ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Ρ‹ΠΌ. Битуация ΠΏΠΎΠ΄ΠΎΠ±Π½Π° Ρ‚ΠΎΠΌΡƒ ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Nothing ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Maybe a.

ΠœΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ Maybe Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вычислСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ. Но ΠΈΠ½ΠΎΠ³Π΄Π° Ρ‚ΠΈΠΏ Maybe Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠ΄ΠΎΠ±Π΅Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Nothing Π½Π΅ нСсёт Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ пошло Π½Π΅ Ρ‚Π°ΠΊ. Π­Ρ‚ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ случаС – ΠΈΠ»ΠΈ Ссли Π½Π°ΠΌ просто Π½Π΅ интСрСсно, ΠΊΠ°ΠΊ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ функция Β«ΡƒΠΏΠ°Π»Π°Β». Поиск Π² ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠ° Data.Map ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли искомый ΠΊΠ»ΡŽΡ‡ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΡΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ. Но Ссли Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ сработала нСкоторая функция, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ‚ΠΈΠΏΠ° Either a b, Π³Π΄Π΅ a – это Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΌ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ ошибки, ΠΈ b – Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ вычислСния. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ошибки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ конструктор Π΄Π°Π½Π½Ρ‹Ρ… Left, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ конструктор Right.