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

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

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

ΠšΡ€ΠΎΠΌΠ΅ ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ дублирования ΠΊΠΎΠ΄Π°. НапримСр, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Β«ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΈΒ» Ρ€Π΅ΡˆΠΈΠ»ΠΈ, Π±ΡƒΠ΄Ρ‚ΠΎ 2 – это Π½Π° самом Π΄Π΅Π»Π΅ 3, ΠΈ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ свою ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π’ΠΎΠ³Π΄Π° Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ просто ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ doubleMe ΠΊΠ°ΠΊ x + x + x, ΠΈ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ doubleUs Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ doubleMe, данная функция автоматичСски Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° Π±Ρ‹ Π² странном ΠΌΠΈΡ€Π΅, Π³Π΄Π΅ 2 – это 3.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΡƒΠΌΠ½ΠΎΠΆΠ°ΡŽΡ‰ΡƒΡŽ число Π½Π° Π΄Π²Π°, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ это число мСньшС Π»ΠΈΠ±ΠΎ Ρ€Π°Π²Π½ΠΎ 100 (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ числа ΠΈ Ρ‚Π°ΠΊ слишком большиС!):

doubleSmallNumber x = if x > 100

                      then x

                      else x*2

ΠœΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ воспользовались условной конструкциСй if Π² языкС Haskell. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с условными ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… языков. Π Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ условной конструкциСй if Π² Haskell ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ if ΠΈΠ· ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… языков Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Π΅Ρ‚Π²ΡŒ else Π² языкС Haskell являСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ. Π’ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… языках Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Ρƒ шагов, Ссли условиС Π½Π΅ выполняСтся, Π° Π² Haskell ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ функция Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ[4].

МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ if Π² ΠΎΠ΄Π½Ρƒ строку, Π½ΠΎ я ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ это Π½Π΅ Ρ‚Π°ΠΊ Β«Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΒ». Π•Ρ‰Ρ‘ ΠΎΠ΄Π½Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ условной конструкции Π² языкС Haskell состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° являСтся Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ – это ΠΊΠΎΠ΄, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. 5 – это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 5; 4 + 8 – Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, x + y – Ρ‚ΠΎΠΆΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ сумму x ΠΈ y.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Π΅Ρ‚Π²ΡŒ else ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°, конструкция if всСгда Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π²Π΅Ρ€Π½Ρ‘Ρ‚, ΠΈΠ±ΠΎ являСтся Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Если Π±Ρ‹ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ΅ΠΌΡƒΡΡ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния нашСй ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Ρ‘ Ρ‚Π΅Π»ΠΎ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

doubleSmallNumber' x = (if x > 100 then x else x*2) + 1

Если ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ скобки, Ρ‚ΠΎ Π΅Π΄ΠΈΠ½ΠΈΡ†Π° Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ x Π½Π΅ большС 100. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° символ апострофа (') Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Он Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния Π² языкС Haskell. Π­Ρ‚ΠΎ допустимый символ для использования Π² ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ символ прямого апострофа ' для обозначСния строгой (Π½Π΅ Π»Π΅Π½ΠΈΠ²ΠΎΠΉ) вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π»ΠΈΠ±ΠΎ слСгка ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ апостроф – допустимый символ Π² ΠΈΠΌΠ΅Π½Π°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

conanO'Brien = "Π­Ρ‚ΠΎ я, Конан О'Π‘Ρ€Π°ΠΉΠ΅Π½!"

Π—Π΄Π΅ΡΡŒ слСдуСт ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π΄Π²Π΅ Π²Π°ΠΆΠ½Ρ‹Π΅ особСнности. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΡ‹ Π½Π΅ пишСм имя conan с прописной Π±ΡƒΠΊΠ²Ρ‹. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ наимСнования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с прописной Π±ΡƒΠΊΠ²Ρ‹ – Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅ ΠΌΡ‹ разбСрёмся, ΠΏΠΎΡ‡Π΅ΠΌΡƒ. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, данная функция Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΠ°Ρ€Π° ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

Когда функция Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², говорят, Ρ‡Ρ‚ΠΎ это константная функция. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ содСрТаниС ΠΈΠΌΡ‘Π½ (ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ) послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ conanO'Brien ΠΈ строка "Π­Ρ‚ΠΎ я, Конан О'Π‘Ρ€Π°ΠΉΠ΅Π½!" ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ взаимозамСняСмо.

Бписки

Как ΠΈ списки ΠΏΠΎΠΊΡƒΠΏΠΎΠΊ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΌΠΈΡ€Π΅, списки Π² языкС Haskell ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹. Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим основы Ρ€Π°Π±ΠΎΡ‚Ρ‹ со списками, Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ списков ΠΈ строками (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ списками).



Бписки Π² языкС Haskell ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π³ΠΎΠΌΠΎΠ³Π΅Π½Π½Ρ‹ΠΌΠΈ структурами Π΄Π°Π½Π½Ρ‹Ρ…; это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² Π½ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ элСмСнты Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. МоТно ΠΈΠΌΠ΅Ρ‚ΡŒ список Ρ†Π΅Π»Ρ‹Ρ… ΠΈΠ»ΠΈ список символов, Π½ΠΎ нСльзя ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список с Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами ΠΈ символами ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

Бписки Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Π΅ скобки, Π° элСмСнты Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ запятыми:

ghci> let lostNumbers = [4,8,15,16,23,42]

ghci> lostNumbers

[4,8,15,16,23,42]

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово let, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ имя прямо Π² GHCi. НапримСр, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ let a = 1 ΠΈΠ· GHCi – эквивалСнт указания a = 1 Π² скриптС с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ.

ΠšΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΡ

ОбъСдинСниС Π΄Π²ΡƒΡ… списков – стандартная Π·Π°Π΄Π°Ρ‡Π°. Она выполняСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ++[5].

ghci> [1,2,3,4] ++ [9,10,11,12] [1,2,3,4,9,10,11,12]

ghci> "ΠΏΡ€ΠΈΠ²Π΅Ρ‚" ++ " " ++ "ΠΌΠΈΡ€"

"ΠΏΡ€ΠΈΠ²Π΅Ρ‚ ΠΌΠΈΡ€"

ghci> ['Π²','ΠΎ'] ++ ['-'] ++ ['ΠΎ','Ρ‚']

"Π²ΠΎ-ΠΎΡ‚"

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Π² языкС Haskell ΡΠ²Π»ΡΡŽΡ‚ΡΡ просто списками символов. НапримСр, строка ΠΏΡ€ΠΈΠ²Π΅Ρ‚ – это Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ список ['ΠΏ','Ρ€','ΠΈ','Π²','Π΅','Ρ‚']. Благодаря этому для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ символов, Ρ‡Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ.

Π‘ΡƒΠ΄ΡŒΡ‚Π΅ остороТны ΠΏΡ€ΠΈ использовании ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ++ с Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌΠΈ строками. Если Π²Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚Π΅ Π΄Π²Π° списка (Π΄Π°ΠΆΠ΅ Ссли Π² ΠΊΠΎΠ½Π΅Ρ† ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ… дописываСтся Π²Ρ‚ΠΎΡ€ΠΎΠΉ, состоящий ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ [1,2,3] ++ [4]), Ρ‚ΠΎ язык Haskell Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ вСсь список с Π»Π΅Π²ΠΎΠΉ стороны ΠΎΡ‚ ++. Π­Ρ‚ΠΎ Π½Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ нСбольшиС списки, Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊ списку ΠΈΠ· 50 000 000 элСмСнтов Π·Π°ΠΉΠΌΡ‘Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. А Π²ΠΎΡ‚ Ссли Π²Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² Π½Π°Ρ‡Π°Π»ΠΎ списка с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° : (Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Β«consΒ»), Π΄ΠΎΠ»Π³ΠΎ ΠΆΠ΄Π°Ρ‚ΡŒ Π½Π΅ придётся.

ghci> 'Π’':"ОВ КОШКА"

"Π’ΠžΠ’ КОШКА"

ghci> 5:[1,2,3,4,5]

[5,1,2,3,4,5]

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ : ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ число ΠΈ список чисСл ΠΈΠ»ΠΈ символ ΠΈ список символов, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ++ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° списка. Π”Π°ΠΆΠ΅ Ссли Π²Ρ‹ добавляСтС ΠΎΠ΄ΠΈΠ½ элСмСнт Π² ΠΊΠΎΠ½Π΅Ρ† списка с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ++, слСдуСт Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ этот элСмСнт Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Π΅ скобки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ стал списком:

ghci> [1,2,3,4] ++ [5]

[1,2,3,4,5]

ΠΠ°ΠΏΠΈΡΠ°Ρ‚ΡŒ [1,2,3,4] ++ 5 нСльзя, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ±Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ++ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ списками, Π° 5 – это Π½Π΅ список, Π° число.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, Ρ‡Ρ‚ΠΎ [1,2,3] – это Π½Π° самом Π΄Π΅Π»Π΅ синтаксичСский Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ 1:2:3:[]. Бписок [] – пустой, ΠΈ Ссли ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊ Π΅Π³ΠΎ Π½Π°Ρ‡Π°Π»Ρƒ 3, получится [3]; Ссли Π·Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² Π½Π°Ρ‡Π°Π»ΠΎ 2, получится [2,3] ΠΈ Ρ‚. Π΄.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. Бписки [], [[]] ΠΈ [[],[],[]] ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π·Π½Ρ‹Π΅. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ – это пустой список; Π²Ρ‚ΠΎΡ€ΠΎΠΉ – список, содСрТащий пустой список; Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ – список, содСрТащий Ρ‚Ρ€ΠΈ пустых списка.

ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ элСмСнтам списка

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ элСмСнт ΠΈΠ· списка ΠΏΠΎ индСксу, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ !!. Π˜Π½Π΄Π΅ΠΊΡΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с нуля.

ghci> "Π‘Ρ‚ΠΈΠ² Π‘ΡƒΡˆΠ΅ΠΌΠΈ" !! 5

'Π‘'

ghci> [9.4,33.2,96.2,11.2,23.25] !! 1

33.2

Но Ссли Π²Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡˆΠ΅ΡΡ‚ΠΎΠΉ элСмСнт списка, состоящСго ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Ρ‘Ρ… элСмСнтов, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ сообщСниС ΠΎΠ± ошибкС, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄ΡŒΡ‚Π΅ остороТны!

Бписки списков

Бписки ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ списки. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ списки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат списки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат списки…

ghci> let b = [[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]]

ghci> b

[[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]]

ghci> b ++ [[1,1,1,1]]

[[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3],[1,1,1,1]]

ghci> [6,6,6]:b

[[6,6,6],[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]]

ghci> b !! 2

[1,2,2,3,4]

Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ списки ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, Π½ΠΎ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². Подобно Ρ‚ΠΎΠΌΡƒ ΠΊΠ°ΠΊ нСльзя ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ список, содСрТащий нСсколько символов ΠΈ нСсколько чисСл, нСльзя ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ список, содСрТащий нСсколько списков символов ΠΈ нСсколько списков чисСл.

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ списков

Бписки ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΎΠ½ΠΈ содСрТат сравнимыС элСмСнты. ΠŸΡ€ΠΈ использовании ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² <, <=, >= ΠΈ > сравнСниС происходит Π² лСксикографичСском порядкС. Π‘Π½Π°Ρ‡Π°Π»Π° ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ Β«Π³ΠΎΠ»ΠΎΠ²Ρ‹Β» списков; Ссли ΠΎΠ½ΠΈ Ρ€Π°Π²Π½Ρ‹, Ρ‚ΠΎ ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π²Ρ‚ΠΎΡ€Ρ‹Π΅ элСмСнты. Если Ρ€Π°Π²Π½Ρ‹ ΠΈ Π²Ρ‚ΠΎΡ€Ρ‹Π΅ элСмСнты, Ρ‚ΠΎ ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈ – ΠΈ Ρ‚. Π΄., ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠ΅ΡΡ элСмСнты. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ сравнСния списков опрСдСляСтся ΠΏΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ сравнСния ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΡ…ΡΡ элСмСнтов.

Π‘Ρ€Π°Π²Π½ΠΈΠΌ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° [3,4,2]<[3,4,3]. Haskell Π²ΠΈΠ΄ΠΈΡ‚, Ρ‡Ρ‚ΠΎ 3 ΠΈ 3 Ρ€Π°Π²Π½Ρ‹, поэтому ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ 4 ΠΈ 4, Π½ΠΎ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ‚ΠΎΠΆΠ΅ Ρ€Π°Π²Π½Ρ‹, сравниваСт 2 ΠΈ 3. Число 2 мСньшС 3, поэтому ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ список мСньшС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ. Аналогично выполняСтся сравнСниС Π½Π° <=, >= ΠΈ >:

ghci> [3,2,1] > [2,1,0]

True

ghci> [3,2,1] > [2,10,100]

True

ghci> [3,4,2] < [3,4,3]

True

ghci> [3,4,2] > [2,4]

True

ghci> [3,4,2] == [3,4,2]

True

НСпустой список всСгда считаСтся большС, Ρ‡Π΅ΠΌ пустой. Π­Ρ‚ΠΎ позволяСт ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π»ΡŽΠ±Ρ‹Π΅ Π΄Π²Π° списка, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… Ρ‚ΠΎΡ‡Π½ΠΎ совпадаСт с Π½Π°Ρ‡Π°Π»ΠΎΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ.

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ списками

Π§Ρ‚ΠΎ Π΅Ρ‰Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ со списками? Π’ΠΎΡ‚ нСсколько основных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌΠΈ.