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

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

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

НапримСр, Π² школС Π΅ΡΡ‚ΡŒ ΡˆΠΊΠ°Ρ„Ρ‡ΠΈΠΊΠΈ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡ‡Π΅Π½ΠΈΠΊΠ°ΠΌ Π±Ρ‹Π»ΠΎ ΠΊΡƒΠ΄Π° ΠΊΠ»Π΅ΠΈΡ‚ΡŒ постСры Guns’n’Roses. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΡˆΠΊΠ°Ρ„Ρ‡ΠΈΠΊ открываСтся ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ. Если ΡˆΠΊΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ понадобился ΡˆΠΊΠ°Ρ„Ρ‡ΠΈΠΊ, ΠΎΠ½ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ администратору, ΡˆΠΊΠ°Ρ„Ρ‡ΠΈΠΊ ΠΏΠΎΠ΄ ΠΊΠ°ΠΊΠΈΠΌ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ Π΅ΠΌΡƒ нравится, ΠΈ администратор Π²Ρ‹Π΄Π°Ρ‘Ρ‚ Π΅ΠΌΡƒ ΠΊΠΎΠ΄. Если этот ΡˆΠΊΠ°Ρ„Ρ‡ΠΈΠΊ ΡƒΠΆΠ΅ ΠΊΠ΅ΠΌ-Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, администратор Π½Π΅ сообщаСт ΠΊΠΎΠ΄ – ΠΎΠ½ΠΈ вмСстС с ΡƒΡ‡Π΅Π½ΠΈΠΊΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚. Π‘ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Data.Map для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΡˆΠΊΠ°Ρ„Ρ‡ΠΈΠΊΠ°Ρ…. Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ· Π½ΠΎΠΌΠ΅Ρ€Π° ΡˆΠΊΠ°Ρ„Ρ‡ΠΈΠΊΠ° Π² ΠΏΠ°Ρ€Ρƒ, Π³Π΄Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡˆΠΊΠ°Ρ„Ρ‡ΠΈΠΊ ΠΈΠ»ΠΈ Π½Π΅Ρ‚, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ – ΠΊΠΎΠ΄ ΡˆΠΊΠ°Ρ„Ρ‡ΠΈΠΊΠ°.

import qualified Data.Map as Map


data LockerState = Taken | Free deriving (Show, Eq)


type Code = String


type LockerMap = Map.Map Int (LockerState, Code)

Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ просто. ΠœΡ‹ объявляСм Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… для хранСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΎΠΌ, Π±Ρ‹Π» ΡˆΠΊΠ°Ρ„Ρ‡ΠΈΠΊ занят ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Π’Π°ΠΊΠΆΠ΅ ΠΌΡ‹ создаём синоним для ΠΊΠΎΠ΄Π° ΡˆΠΊΠ°Ρ„Ρ‡ΠΈΠΊΠ° ΠΈ для Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ†Π΅Π»Ρ‹Π΅ числа Π² ΠΏΠ°Ρ€Ρ‹ ΠΈΠ· статуса ΡˆΠΊΠ°Ρ„Ρ‡ΠΈΠΊΠ° ΠΈ ΠΊΠΎΠ΄Π°. Π’Π΅ΠΏΠ΅Ρ€ΡŒ создадим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для поиска ΠΊΠΎΠ΄Π° ΠΏΠΎ Π½ΠΎΠΌΠ΅Ρ€Ρƒ. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Either String Code для прСдставлСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ поиск ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΡƒΠ΄Π°Ρ‚ΡŒΡΡ ΠΏΠΎ Π΄Π²ΡƒΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ – ΡˆΠΊΠ°Ρ„Ρ‡ΠΈΠΊ ΡƒΠΆΠ΅ занят, Π² этом случаС нСльзя ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΈΠ»ΠΈ Π½ΠΎΠΌΠ΅Ρ€ ΡˆΠΊΠ°Ρ„Ρ‡ΠΈΠΊΠ° Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ Π²ΠΎΠΎΠ±Ρ‰Π΅. Если поиск Π½Π΅ удался, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° String с пояснСниями.

lockerLookup :: Int –> LockerMap –> Either String Code

lockerLookup lockerNumber map =

  case Map.lookup lockerNumber map of

   Nothing –> Left $ "Π¨ΠΊΠ°Ρ„Ρ‡ΠΈΠΊ β„– " ++ show lockerNumber ++

                     " Π½Π΅ сущСствуСт!"


   Just (state, code) –>

      if state /= Taken

        then Right code

        else Left $ "Π¨ΠΊΠ°Ρ„Ρ‡ΠΈΠΊ β„– " ++ show lockerNumber ++ " ΡƒΠΆΠ΅ занят!"

ΠœΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ поиск ΠΏΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ. Если ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Nothing, Ρ‚ΠΎ Π²Π΅Ρ€Π½Ρ‘ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Left String, говорящСС, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Π½ΠΎΠΌΠ΅Ρ€ Π½Π΅ сущСствуСт. Если ΠΌΡ‹ нашли Π½ΠΎΠΌΠ΅Ρ€, Π΄Π΅Π»Π°Π΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ, занят Π»ΠΈ ΡˆΠΊΠ°Ρ„Ρ‡ΠΈΠΊ. Если ΠΎΠ½ занят, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Left, говорящСС, Ρ‡Ρ‚ΠΎ ΡˆΠΊΠ°Ρ„Ρ‡ΠΈΠΊ занят. Если ΠΎΠ½ Π½Π΅ занят, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Right Code, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΄Π°Ρ‘ΠΌ студСнту ΠΊΠΎΠ΄ ΡˆΠΊΠ°Ρ„Ρ‡ΠΈΠΊΠ°. На самом Π΄Π΅Π»Π΅ это Right String, Π½ΠΎ ΠΌΡ‹ создали синоним Ρ‚ΠΈΠΏΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ наши объявлСния Π±ΠΎΠ»Π΅Π΅ понятными. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ отобраТСния:

lockers :: LockerMap lockers = Map.fromList

  [(100,(Taken,"ZD39I"))

  ,(101,(Free,"JAH3I"))

  ,(103,(Free,"IQSA9"))

  ,(105,(Free,"QOTSA"))

  ,(109,(Taken,"893JJ"))

  ,(110,(Taken,"99292"))

  ]

Π”Π°Π²Π°ΠΉΡ‚Π΅ попытаСмся ΡƒΠ·Π½Π°Ρ‚ΡŒ нСсколько ΠΊΠΎΠ΄ΠΎΠ².

ghci> lockerLookup 101 lockers

Right "JAH3I"

ghci> lockerLookup 100 lockers

Left "Π¨ΠΊΠ°Ρ„Ρ‡ΠΈΠΊ β„– 100 ΡƒΠΆΠ΅ занят!"

ghci> lockerLookup 102 lockers

Left "Π¨ΠΊΠ°Ρ„Ρ‡ΠΈΠΊ β„– 102 Π½Π΅ сущСствуСт!"

ghci> lockerLookup 110 lockers

Left "Π¨ΠΊΠ°Ρ„Ρ‡ΠΈΠΊ β„– 110 ΡƒΠΆΠ΅ занят!"

ghci> lockerLookup 105 lockers

Right "QOTSA"

ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Maybe для прСдставлСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, Π½ΠΎ Ρ‚ΠΎΠ³Π΄Π° лишились Π±Ρ‹ возмоТности ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ нСльзя ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄. А Π² нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° ошибки выводится ΠΈΠ· Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ°.

РСкурсивныС структуры Π΄Π°Π½Π½Ρ‹Ρ…


Как ΠΌΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, конструкторы алгСбраичСских Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько ΠΏΠΎΠ»Π΅ΠΉ (ΠΈΠ»ΠΈ Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ вовсС), ΠΈ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ поля Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ. ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ это Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ, конструктор ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ поля Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ самого Ρ‚ΠΈΠΏΠ°! Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ рСкурсивныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Π³Π΄Π΅ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° содСрТит Π΄Ρ€ΡƒΠ³ΠΈΠ΅ значСния этого Ρ‚ΠΈΠΏΠ°, Π° ΠΎΠ½ΠΈ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, содСрТат Π΅Ρ‰Ρ‘ значСния Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, ΠΈ Ρ‚. Π΄.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° этот список: [5]. Π­Ρ‚ΠΎ упрощённая запись выраТСния 5:[]. Π‘ Π»Π΅Π²ΠΎΠΉ стороны ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° : ставится Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, с ΠΏΡ€Π°Π²ΠΎΠΉ стороны – список (Π² нашСм случаС пустой). Как насчёт списка [4,5]? Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ: 4:(5:[]). Бмотря Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ :, ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ слСва ΠΎΡ‚ Π½Π΅Π³ΠΎ – всё Ρ‚Π°ΠΊ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° справа – список (5:[]). Π’ΠΎ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ списка 3:(4:(5:6:[])); это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ ΠΊΠ°ΠΊ 3:4:5:6:[] (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ : правоассоциативСн), ΠΈ ΠΊΠ°ΠΊ [3,4,5,6].

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ список ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пустым ΠΈΠ»ΠΈ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ элСмСнт, присоСдинённый с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° : ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ списку (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пустым ΠΈΠ»ΠΈ Π½Π΅Ρ‚).

Ну Ρ‡Ρ‚ΠΎ ΠΆ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ алгСбраичСскиС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ наш собствСнный список.

data List a = Empty | Cons a (List a) deriving (Show, Read, Eq, Ord)

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΊΠ°ΠΊ нашС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ списка Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ². Π­Ρ‚ΠΎ Π»ΠΈΠ±ΠΎ пустой список, Π»ΠΈΠ±ΠΎ комбинация Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ значСния (Β«Π³ΠΎΠ»ΠΎΠ²Ρ‹Β») ΠΈ собствСнно списка («хвоста»). Если такая Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠ° Ρ‚Ρ€ΡƒΠ΄Π½Π° для понимания, Ρ‚ΠΎ с использованиСм синтаксиса записСй ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ Π»Π΅Π³Ρ‡Π΅.

data List a = Empty | Cons { listHead :: a, listTail :: List a}

    deriving (Show, Read, Eq, Ord)

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Cons ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π½Π΅Π΄ΠΎΡƒΠΌΠ΅Π½ΠΈΠ΅. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Cons – всСго лишь Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ :. Как Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π² списках ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ : – это просто конструктор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ список ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ наш Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ для задания списка! Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° поля: ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Ρ‚ΠΈΠΏΠ° a ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠ΅ Ρ‚ΠΈΠΏΠ° [a].

ghci> Empty

Empty

ghci> 5 `Cons` Empty

Cons 5 Empty

ghci> 4 `Cons` (5 `Cons` Empty)

Cons 4 (Cons 5 Empty)

ghci> 3 `Cons` (4 `Cons` (5 `Cons` Empty))

Cons 3 (Cons 4 (Cons 5 Empty))

ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ конструктор Cons ΠΊΠ°ΠΊ инфиксный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ наглядно ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΅Π³ΠΎ вмСсто ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° :. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Empty ΠΈΠ³Ρ€Π°Π΅Ρ‚ Ρ€ΠΎΠ»ΡŒ пустого списка [], ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 4 `Cons` (5 `Cons` Empty) ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ 4:(5:[]).

Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ нашСго списка

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊΠ°ΠΊ ΠΈΠ½Ρ„ΠΈΠΊΡΠ½ΡƒΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ссли Π΅Ρ‘ имя состоит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… символов. Π’ΠΎ ΠΆΠ΅ самоС ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈ с конструкторами, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это просто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅:

infixr 5 :–:

data List a = Empty | a :–: (List a) deriving (Show, Read, Eq, Ord)

ΠŸΠ΅Ρ€Π²ΠΎΠ΅: ΠΌΡ‹ использовали Π½ΠΎΠ²ΡƒΡŽ ΡΠΈΠ½Ρ‚Π°ΠΊΡΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ, Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡŽ ассоциативности Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Если ΠΌΡ‹ опрСдСляСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ассоциативности, Π½ΠΎ Π½Π΅ обязаны этого Π΄Π΅Π»Π°Ρ‚ΡŒ. ΠΡΡΠΎΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΎΠ²Π° ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΈ являСтся Π»ΠΈ ΠΎΠ½ Π»Π΅Π²ΠΎ- ΠΈΠ»ΠΈ правоассоциативным. НапримСр, Π°ΡΡΠΎΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ умноТСния – infixl 7 *, Π°ΡΡΠΎΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ слоТСния – infixl 6. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° лСвоассоциативны, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 4 * 3 * 2 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ((4 * 3) * 2), ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ высокий ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, Ρ‡Π΅ΠΌ слоТСниС, поэтому Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 5 * 4 + 3 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ (5 * 4) + 3.

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ a :–: (List a) вмСсто Cons a (List a). Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ списки нашСго Π½ΠΎΠ²ΠΎΠ³ΠΎ спискового Ρ‚ΠΈΠΏΠ° Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ghci> 3 :-: 4 :-: 5 :-: Empty

3 :-: (4 :-: (5 :-: Empty))

ghci> let a = 3 :-: 4 :-: 5 :-: Empty

ghci> 100 :-: a

100 :-: (3 :-: (4 :-: (5 :-: Empty))

НапишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для слоТСния Π΄Π²ΡƒΡ… списков. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ++ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… списков:

infixr 5 ++

(++) :: [a] –> [a] –> [a]

[] ++ ys = ys

(x:xs) ++ ys = x : (xs ++ ys)

Π”Π°Π²Π°ΠΉΡ‚Π΅ просто ΠΏΠ΅Ρ€Π΅Π΄Π΅Ρ€Ρ‘ΠΌ это объявлСниС для нашСго списка! Назовём Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ^++:

infixr 5 ++

(^++) :: List a –> List a –> List a

Empty ^++ ys = ys

(x :–: xs) ++ ys = x :–: (xs ++ ys)

И посмотрим, ΠΊΠ°ΠΊ это работаСт…

ghci> let a = 3 :-: 4 :-: 5 :-: Empty

ghci> let b = 6 :-: 7 :-: Empty

ghci> a ++ b

3 :-: (4 :-: (5 :-: (6 :-: (7 :-: Empty))))

ΠžΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ. Если Π±Ρ‹ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со списками ΠΈ для нашСго спискового Ρ‚ΠΈΠΏΠ°.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ выполняли сопоставлСниС с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ ΠΏΠΎ (x :–: xs). Π­Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ данная опСрация сопоставляСт конструкторы. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎ конструктору :–: ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ это конструктор для нашСго собствСнного спискового Ρ‚ΠΈΠΏΠ°, Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈ ΠΏΠΎ конструктору :, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это конструктор встроСнного спискового Ρ‚ΠΈΠΏΠ°. Π’Π°ΠΊ ΠΊΠ°ΠΊ сопоставлСниС производится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ конструкторам, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ соотвСтствиС ΠΏΠΎ ΠΎΠ±Ρ€Π°Π·Ρ†Π°ΠΌ, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ (x :–: xs), ΠΈΠ»ΠΈ константам, Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ 8 ΠΈΠ»ΠΈ 'a', ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ конструкторами для числового ΠΈ символьного Ρ‚ΠΈΠΏΠΎΠ²[10].

Вырастим-ΠΊΠ° Π΄Π΅Ρ€Π΅Π²ΠΎ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ собираСмся Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ поисковоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Если Π²Π°ΠΌ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ поисковыС Π΄Π΅Ρ€Π΅Π²ΡŒΡ ΠΈΠ· языков Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Π‘, Π²ΠΎΡ‚ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой: элСмСнт ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π΄Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… элСмСнта, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€Π°Π²Ρ‹ΠΉ, Π΄Ρ€ΡƒΠ³ΠΎΠΉ – Π»Π΅Π²Ρ‹ΠΉ. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ слСва – мСньшС, Ρ‡Π΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ, элСмСнт справа – большС. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· этих Π΄Π²ΡƒΡ… элСмСнтов Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Π΄Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… элСмСнта (ΠΈΠ»ΠΈ Π½Π° ΠΎΠ΄ΠΈΠ½, ΠΈΠ»ΠΈ Π½Π΅ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π²ΠΎΠΎΠ±Ρ‰Π΅). ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄ΠΎ Π΄Π²ΡƒΡ… ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π². Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ поисковыС Π΄Π΅Ρ€Π΅Π²ΡŒΡ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ всС элСмСнты Π² Π»Π΅Π²ΠΎΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π΅ элСмСнта со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, скаТСм, ΠΏΡΡ‚ΡŒ, Π±ΡƒΠ΄ΡƒΡ‚ мСньшС пяти. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ Π² ΠΏΡ€Π°Π²ΠΎΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π΅ Π±ΡƒΠ΄ΡƒΡ‚ большС пяти. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли Π½Π°ΠΌ Π½Π°Π΄ΠΎ Π½Π°ΠΉΡ‚ΠΈ 8 Π² нашСм Π΄Π΅Ρ€Π΅Π²Π΅, ΠΌΡ‹ Π½Π°Ρ‡Π½Ρ‘ΠΌ с пятёрки, ΠΈ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ 8 большС 5, Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ ΡƒΠ·Π΅Π» со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 7, ΠΈ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ 8 большС 7, снова Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ ΠΏΡ€Π°Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ элСмСнт найдётся всСго Π·Π° Ρ‚Ρ€ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сравнСния! Если ΠΌΡ‹ Π±Ρ‹ искали Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ спискС (ΠΈΠ»ΠΈ Π² сильно разбалансированном Π΄Π΅Ρ€Π΅Π²Π΅), ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Π±Ρ‹ Π΄ΠΎ сСми сравнСний вмСсто Ρ‚Ρ€Ρ‘Ρ… для поиска Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ элСмСнта.