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

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

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

data IntMaybe = INothing | IJust Int


data StringMaybe = SNothing | SJust String


data ShapeMaybe = ShNothing | ShJust Shape

Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для опрСдСлСния самого ΠΎΠ±ΠΎΠ±Ρ‰Ρ‘Π½Π½ΠΎΠ³ΠΎ Maybe, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π»ΡŽΠ±Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²!

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Ρ‚ΠΈΠΏ значСния Nothing – Maybe a. Π­Ρ‚ΠΎ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ: Π² Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ присутствуСт типовая пСрСмСнная – ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π΅Π΅, пСрСмСнная a Π² Ρ‚ΠΈΠΏΠ΅ Maybe a. Если нСкоторая функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° Maybe Int, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Nothing, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ Π½Π΅ содСрТит значСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ этому ΠΏΡ€Π΅ΠΏΡΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ. Π’ΠΈΠΏ Maybe a ΠΌΠΎΠΆΠ΅Ρ‚ вСсти сСбя ΠΊΠ°ΠΊ Maybe Int, Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 5 ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Int ΠΈΠ»ΠΈ Double. Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ‚ΠΈΠΏ пустого списка – это [a]. ΠŸΡƒΡΡ‚ΠΎΠΉ список ΠΌΠΎΠΆΠ΅Ρ‚ вСсти сСбя ΠΊΠ°ΠΊ список Ρ‡Π΅Π³ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠ°ΠΊ [1,2,3] ++ [] ΠΈ ["Ρ…Π°","Ρ…Π°","Ρ…Π°"] ++ [].

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈ ΠΌΠ°ΡˆΠΈΠ½Ρ‹?

Когда ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹? ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΈΡ…, ΠΊΠΎΠ³Π΄Π° наш Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΌΠ΅Ρ‚ΡŒ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ сСбя любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ, ΠΊΠ°ΠΊ это Π΄Π΅Π»Π°Π΅Ρ‚ Maybe a. Если ваш Ρ‚ΠΈΠΏ – это нСкоторая Β«ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ°Β», использованиС Ρ‚ΠΈΠΏΠΎΠ²-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π½ΠΎ. ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ наш Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… Car с Ρ‚Π°ΠΊΠΎΠ³ΠΎ:

data Car = Car { company :: String

               , model :: String

               , year :: Int

               } deriving (Show)

Π½Π° Ρ‚Π°ΠΊΠΎΠΉ:

data Car a b c = Car { company :: a

                     , model :: b

                     , year :: c

                     } deriving (Show)

Но Π²Ρ‹ΠΈΠ³Ρ€Π°Π΅ΠΌ Π»ΠΈ ΠΌΡ‹ Π² Ρ‡Ρ‘ΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ? ΠžΡ‚Π²Π΅Ρ‚ – вСроятно, Π½Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ впослСдствии ΠΌΡ‹ всё Ρ€Π°Π²Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с Ρ‚ΠΈΠΏΠΎΠΌ Car String String Int. НапримСр, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Car, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ свойства автомобиля Π² Π²ΠΈΠ΄Π΅ понятного тСкста:

tellCar :: Car –> String

tellCar (Car {company = c, model = m, year = y}) =

  "ΠΠ²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒ " ++ c ++ " " ++ m ++ ", Π³ΠΎΠ΄: " ++ show y


ghci> let stang = Car {company="Π€ΠΎΡ€Π΄", model="ΠœΡƒΡΡ‚Π°Π½Π³", year=1967}

ghci> tellCar stang

"ΠΠ²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒ Π€ΠΎΡ€Π΄ ΠœΡƒΡΡ‚Π°Π½Π³, Π³ΠΎΠ΄: 1967"

ΠŸΡ€ΠΈΡΡ‚Π½Π°Ρ малСнькая функция. ДСкларация Ρ‚ΠΈΠΏΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ красива ΠΈ понятна. А Ρ‡Ρ‚ΠΎ Ссли Car – это Car a b c?

tellCar :: (Show a) => Car String String a –> String

tellCar (Car {company = c, model = m, year = y}) =

  "ΠΠ²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒ " ++ c ++ " " ++ m ++ ", Π³ΠΎΠ΄: " ++ show y

ΠœΡ‹ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Car Ρ‚ΠΈΠΏΠ° (Show a) => Car String String a. Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, дСкларация Ρ‚ΠΈΠΏΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΠΎΠ»Π΅Π΅ слоТна; СдинствСнноС прСимущСство, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ здСсь имССтся, – ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любой Ρ‚ΠΈΠΏ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ экзСмпляр класса Show, ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ для Ρ‚ΠΈΠΏΠΎΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ c.

ghci> tellCar (Car "Π€ΠΎΡ€Π΄" "ΠœΡƒΡΡ‚Π°Π½Π³" 1967)

"ΠΠ²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒ Π€ΠΎΡ€Π΄ ΠœΡƒΡΡ‚Π°Π½Π³, Π³ΠΎΠ΄: 1967"

ghci> tellCar (Car "Π€ΠΎΡ€Π΄" "ΠœΡƒΡΡ‚Π°Π½Π³" "тысяча Π΄Π΅Π²ΡΡ‚ΡŒΡΠΎΡ‚ ΡˆΠ΅ΡΡ‚ΡŒΠ΄Π΅ΡΡΡ‚ сСдьмой")

"ΠΠ²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒ Π€ΠΎΡ€Π΄ ΠœΡƒΡΡ‚Π°Π½Π³, Π³ΠΎΠ΄: \"тысяча Π΄Π΅Π²ΡΡ‚ΡŒΡΠΎΡ‚ ΡˆΠ΅ΡΡ‚ΡŒΠ΄Π΅ΡΡΡ‚ сСдьмой\""

ghci> :t Car "Π€ΠΎΡ€Π΄" "ΠœΡƒΡΡ‚Π°Π½Π³" 1967

Car "Π€ΠΎΡ€Π΄" "ΠœΡƒΡΡ‚Π°Π½Π³" 1967 :: (Num t) => Car [Char] [Char] t

ghci> :t Car "Π€ΠΎΡ€Π΄" "ΠœΡƒΡΡ‚Π°Π½Π³" "тысяча Π΄Π΅Π²ΡΡ‚ΡŒΡΠΎΡ‚ ΡˆΠ΅ΡΡ‚ΡŒΠ΄Π΅ΡΡΡ‚ сСдьмой"

Car "Π€ΠΎΡ€Π΄" "ΠœΡƒΡΡ‚Π°Π½Π³" "тысяча Π΄Π΅Π²ΡΡ‚ΡŒΡΠΎΡ‚ ΡˆΠ΅ΡΡ‚ΡŒΠ΄Π΅ΡΡΡ‚ сСдьмой"

  :: Car [Char] [Char] [Char]

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΌΡ‹ всё Ρ€Π°Π²Π½ΠΎ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв использовали Π±Ρ‹ Car String String Int, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ° Car большого смысла Π½Π΅Ρ‚. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Ρ‚ΠΈΠΏΡ‹, ΠΊΠΎΠ³Π΄Π° для Ρ€Π°Π±ΠΎΡ‚Ρ‹ нашСго Ρ‚ΠΈΠΏΠ° Π½Π΅Π²Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Π² Π½Ρ‘ΠΌ хранится. Бписок элСмСнтов – это просто список элСмСнтов, ΠΈ Π½Π΅Π²Π°ΠΆΠ½ΠΎ, ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΠ½ΠΈ Ρ‚ΠΈΠΏΠ°: список Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π²Π½Π΅ зависимости ΠΎΡ‚ этого. Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΡƒΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ список чисСл, Ρ‚ΠΎ Π² ΡΡƒΠΌΠΌΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ список чисСл. Π’ΠΎ ΠΆΠ΅ самоС Π²Π΅Ρ€Π½ΠΎ ΠΈ для Ρ‚ΠΈΠΏΠ° Maybe. Он прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ΠΈΠΏ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠ³ΠΎ значСния Π½Π΅ Π²Π°ΠΆΠ΅Π½.

Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ извСстный Π½Π°ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° – отобраТСния Map k v ΠΈΠ· модуля Data.Map. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ k – это Ρ‚ΠΈΠΏ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π² ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ v – Ρ‚ΠΈΠΏ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π­Ρ‚ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ использования ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ². ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·Π°Ρ†ΠΈΡ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ позволяСт Π½Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, трСбуя лишь, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΈΠΏ ΠΊΠ»ΡŽΡ‡Π° ΠΈΠΌΠ΅Π» экзСмпляр класса Ord. Если Π±Ρ‹ ΠΌΡ‹ опрСдСляли Ρ‚ΠΈΠΏ для ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Ρ‚ΠΎ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° класс Ρ‚ΠΈΠΏΠ° Π² объявлСнии:

data (Ord k) => Map k v = ...

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π² языкС Haskell принято соглашСниС Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ограничСния класса Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€ΠΈ объявлСнии Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠΎΡ‡Π΅ΠΌΡƒ? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΡΠ΅Ρ€ΡŒΡ‘Π·Π½Ρ‹Ρ… прСимущСств ΠΌΡ‹ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ, Π½ΠΎ Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ² Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всё большС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹. ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΠΌ Π»ΠΈ ΠΌΡ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ (Ord k) Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠ° ΠΈΠ»ΠΈ Π½Π΅ помСстим – всё Ρ€Π°Π²Π½ΠΎ придётся ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΈ объявлСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‰ΠΈΡ…, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ упорядочСн. Но Ссли ΠΌΡ‹ Π½Π΅ помСстим ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π² объявлСнии Ρ‚ΠΈΠΏΠ°, Π½Π°ΠΌ Π½Π΅ придётся ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Π³ΠΎ Π² Ρ‚Π΅Ρ… функциях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅Π²Π°ΠΆΠ½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠ»ΡŽΡ‡ Π±Ρ‹Ρ‚ΡŒ упорядочСн ΠΈΠ»ΠΈ Π½Π΅Ρ‚. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – toList :: Map k a –> [(k, a)]. Если Π±Ρ‹ Map k a ΠΈΠΌΠ΅Π» ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π² объявлСнии, Ρ‚ΠΈΠΏ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ toList Π±Ρ‹Π» Π±Ρ‹ Ρ‚Π°ΠΊΠΈΠΌ: toList :: (Ord k) => Map k a –> [(k, a)], Π΄Π°ΠΆΠ΅ нСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ функция Π½Π΅ сравниваСт элСмСнты Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ.

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΠΉΡ‚Π΅ ограничСния Ρ‚ΠΈΠΏΠΎΠ² Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, Π΄Π°ΠΆΠ΅ Ссли это ΠΈΠΌΠ΅Π»ΠΎ Π±Ρ‹ смысл, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ всё Ρ€Π°Π²Π½ΠΎ придётся ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ограничСния Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Π’Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ ΡΡƒΠ΄ΡŒΠ±Ρ‹

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ Ρ‚Ρ€Ρ‘Ρ…ΠΌΠ΅Ρ€Π½Ρ‹ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΈ нСсколько ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ для Π½Π΅Π³ΠΎ. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΈ содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ числовыС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ чисСл.

data Vector a = Vector a a a deriving (Show)


vplus :: (Num a) => Vector a –> Vector a –> Vector a

(Vector i j k) `vplus` (Vector l m n) = Vector (i+l) (j+m) (k+n)


scalarProd :: (Num a) => Vector a –> Vector a –> a

(Vector i j k) `scalarProd` (Vector l m n) = i*l + j*m + k*n


vmult :: (Num a) => Vector a –> a –> Vector a

(Vector i j k) `vmult` m = Vector (i*m) (j*m) (k*m)

Ѐункция vplus складываСт Π΄Π²Π° Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΏΡƒΡ‚Ρ‘ΠΌ слоТСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚. Ѐункция scalarProd ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для вычислСния скалярного произвСдСния Π΄Π²ΡƒΡ… Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ², функция vmult – для умноТСния Π²Π΅ΠΊΡ‚ΠΎΡ€Π° Π½Π° константу.

Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Vector Int, Vector Integer, Vector Float ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ, Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€ ΠΏΠΎΠΊΠ° Ρ‚ΠΈΠΏ-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ a ΠΈΠ· опрСдСлСния Vector a ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ классу Ρ‚ΠΈΠΏΠΎΠ² Num. По Ρ‚ΠΈΠΏΠ°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΈ всС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ помСстили ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ класса Num Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π°ΠΌ всё Ρ€Π°Π²Π½ΠΎ Π±Ρ‹ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ Π΅Π³ΠΎ Π² функциях.

Π•Ρ‰Ρ‘ Ρ€Π°Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡŽ: ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ конструкторами Ρ‚ΠΈΠΏΠΎΠ² ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΈ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π°ΡΡ‚ΡŒ объявлСния Π΄ΠΎ Π·Π½Π°ΠΊΠ° = прСдставляСт собой конструктор Ρ‚ΠΈΠΏΠ°, Π° Ρ‡Π°ΡΡ‚ΡŒ объявлСния послС этого Π·Π½Π°ΠΊΠ° – конструктор Π΄Π°Π½Π½Ρ‹Ρ… (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ нСсколько конструкторов, Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… символом |). ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚ΠΈΠΏ Vector a a a -> Vector a a a -> a Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΉ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠ°, ΠΈ конструктор Ρ‚ΠΈΠΏΠ° для Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ конструктор Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Ρ€ΠΈ. Π”Π°Π²Π°ΠΉΡ‚Π΅ поупраТняСмся с нашими Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ:

ghci> Vector 3 5 8 `vplus` Vector 9 2 8

Vector 12 7 16

ghci> Vector 3 5 8 `vplus` Vector 9 2 8 `vplus` Vector 0 2 3

Vector 12 9 19

ghci> Vector 3 9 7 `vmult` 10

Vector 30 90 70

ghci> Vector 4 9 5 `scalarProd` Vector 9.0 2.0 4.0

74.0

ghci> Vector 2 9 3 `vmult` (Vector 4 9 5 `scalarProd`

Vector 9 2 4) Vector 148 666 222

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ экзСмпляры


Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«ΠšΠ»Π°ΡΡΡ‹ Ρ‚ΠΈΠΏΠΎΠ²Β» Π³Π»Π°Π²Ρ‹ 2 ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ свСдСния ΠΎ классах Ρ‚ΠΈΠΏΠΎΠ². ΠœΡ‹ упомянули, Ρ‡Ρ‚ΠΎ класс Ρ‚ΠΈΠΏΠΎΠ² – это Π½Π΅Ρ‡Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ интСрфСйса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Π’ΠΈΠΏ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сдСлан экзСмпляром класса, Ссли ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Ρ‚ΠΈΠΏ Int Π΅ΡΡ‚ΡŒ экзСмпляр класса Ρ‚ΠΈΠΏΠΎΠ² Eq, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ класс Eq опрСдСляСт ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ для сущностСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Ρ‹ Π½Π° равСнство. Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ†Π΅Π»Ρ‹Π΅ числа ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π° равСнство, Ρ‚ΠΈΠΏ Int ΠΈΠΌΠ΅Π΅Ρ‚ экзСмпляр для класса Eq. РСальная польза ΠΎΡ‚ этого Π²ΠΈΠ΄Π½Π° ΠΏΡ€ΠΈ использовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ слуТат интСрфСйсом класса Eq, – ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² == ΠΈ /=. Если Ρ‚ΠΈΠΏ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ экзСмпляр класса Eq, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ == ΠΊ значСниям этого Ρ‚ΠΈΠΏΠ°. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ выраТСния 4 == 4 ΠΈ "Ρ€Π°Π·" /= "Π΄Π²Π°" проходят ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‚ΠΈΠΏΠΎΠ².