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

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

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

ghci> [x*2 | x <– [1..10]]

[2,4,6,8,10,12,14,16,18,20]

Π’ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ [x*2 | x <– [1..10]] ΠΌΡ‹ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ элСмСнты ΠΈΠ· списка [1..10], Ρ‚. Π΅. x ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ всС значСния элСмСнтов списка. Иногда говорят, Ρ‡Ρ‚ΠΎ x связываСтся с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ элСмСнтом списка. Π§Π°ΡΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°, находящаяся Π»Π΅Π²Π΅Π΅ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ‡Π΅Ρ€Ρ‚Ρ‹ |, опрСдСляСт значСния элСмСнтов Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ списка. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ значСния x, ΠΈΠ·Π²Π»Π΅Ρ‡Ρ‘Π½Π½Ρ‹Π΅ ΠΈΠ· списка [1..10], ΡƒΠΌΠ½ΠΎΠΆΠ°ΡŽΡ‚ΡΡ Π½Π° Π΄Π²Π°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊ этому Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ условиС Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ (ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚). Условия ΠΈΠ΄ΡƒΡ‚ послС задания источника Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΎΡ‚ Π½Π΅Π³ΠΎ запятой. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ элСмСнты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, Π±ΡƒΠ΄ΡƒΡ‡ΠΈ ΡƒΠ΄Π²ΠΎΠ΅Π½Π½Ρ‹ΠΌΠΈ, большС Π»ΠΈΠ±ΠΎ Ρ€Π°Π²Π½Ρ‹ 12.

ghci> [x*2 | x <– [1..10], x*2 >= 12]

[12,14,16,18,20]

Π­Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π—Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ! А ΠΊΠ°ΠΊ насчёт ситуации, ΠΊΠΎΠ³Π΄Π° трСбуСтся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всС числа ΠΎΡ‚ 50 Π΄ΠΎ 100, остаток ΠΎΡ‚ дСлСния Π½Π° 7 ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π²Π΅Π½ 3? Π›Π΅Π³ΠΊΠΎ!

ghci> [ x | x <– [50..100], x `mod` 7 == 3]

[52,59,66,73,80,87,94]

И снова ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ!

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ€Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ списков с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ условий Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ Ρ‚Π°ΠΊΠΆΠ΅ называСтся Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠ΅ΠΉ.

ΠœΡ‹ взяли список чисСл ΠΈ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Π»ΠΈ ΠΈΡ… условиями. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ замСняСт ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π½Π΅Ρ‡Ρ‘Ρ‚Π½ΠΎΠ΅ число большС 10 Π½Π° БАΠ₯!", Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π½Π΅Ρ‡Ρ‘Ρ‚Π½ΠΎΠ΅ число мСньшС 10 – Π½Π° Π‘Π£Πœ!". Если число Ρ‡Ρ‘Ρ‚Π½ΠΎΠ΅, ΠΌΡ‹ выбрасываСм Π΅Π³ΠΎ ΠΈΠ· нашСго списка. Для удобства помСстим Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΌ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ.

boomBangs xs = [if x < 10 then "Π‘Π£Πœ!" else "БАΠ₯!" | x <– xs, odd x]

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² GHCi, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Π΅Ρ‘ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ let. Если ΠΆΠ΅ Π²Ρ‹ описываСтС Π΅Ρ‘ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚Π΅ Π΅Π³ΠΎ Π² GHCi, Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ let Π½Π΅ трСбуСтся.

ПослСдняя Ρ‡Π°ΡΡ‚ΡŒ описания – условиС Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ. Ѐункция odd Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True для Π½Π΅Ρ‡Ρ‘Ρ‚Π½Ρ‹Ρ… чисСл ΠΈ False – для Ρ‡Ρ‘Ρ‚Π½Ρ‹Ρ…. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² список, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли всС условия Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True.

ghci> boomBangs [7..13]

["Π‘Π£Πœ!","Π‘Π£Πœ!","БАΠ₯!","БАΠ₯!"]

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько условий Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ. Если Π±Ρ‹ ΠΏΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всС числа ΠΎΡ‚ 10 Π΄ΠΎ 20, ΠΊΡ€ΠΎΠΌΠ΅ 13, 15 ΠΈ 19, Ρ‚ΠΎ ΠΌΡ‹ Π±Ρ‹ написали:

ghci> [x | x <– [10..20], x /= 13, x /= 15, x /= 19]

[10,11,12,14,16,17,18,20]

МоТно Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ нСсколько условий Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ Π² Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… списков (элСмСнт Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡ‚ΡŒ всСм условиям, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ список), Π½ΠΎ ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ элСмСнты ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… списков. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС выраТСния ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°ΡŽΡ‚ всС ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΈΠ· Π΄Π°Π½Π½Ρ‹Ρ… списков ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ ΠΈΡ… ΠΏΠΎ производящСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΡƒΠΊΠ°Π·Π°Π»ΠΈ:

ghci> [x+y | x <- [1,2,3], y <- [10,100,1000]]

[11,101,1001,12,102,1002,13,103,1003]

Π—Π΄Π΅ΡΡŒ x бСрётся ΠΈΠ· списка [1,2,3], Π° y – ΠΈΠ· списка [10,100,1000]. Π­Ρ‚ΠΈ Π΄Π²Π° списка ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, x становится Ρ€Π°Π²Π½Ρ‹ΠΌ 1, Π° y ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ всС значСния ΠΈΠ· списка [10,100,1000]. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ значСния x ΠΈ y ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ, Π² Π½Π°Ρ‡Π°Π»ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ списка ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ числа 11, 101 ΠΈ 1001 (1 прибавляСтся ΠΊ 10, 100, 1000). ПослС этого x становится Ρ€Π°Π²Π½Ρ‹ΠΌ 2 ΠΈ всё повторяСтся, ΠΊ списку Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ числа 12, 102 ΠΈ 1002. Π’ΠΎ ΠΆΠ΅ самоС происходит для x Ρ€Π°Π²Π½ΠΎΠ³ΠΎ 3.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт x ΠΈΠ· списка [1,2,3] всСми Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌΠΈ способами комбинируСтся с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ элСмСнтом y ΠΈΠ· списка [10,100,1000], Π° x+y ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для построСния ΠΈΠ· этих ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ списка.

Π’ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: Ссли Ρƒ нас Π΅ΡΡ‚ΡŒ Π΄Π²Π° списка [2,5,10] ΠΈ [8,10,11], ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ произвСдСния всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ ΠΈΠ· элСмСнтов этих списков, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

ghci> [x*y | x <– [2,5,10], y <– [8,10,11]]

[16,20,22,40,50,55,80,100,110]

Как ΠΈ оТидалось, Π΄Π»ΠΈΠ½Π° Π½ΠΎΠ²ΠΎΠ³ΠΎ списка Ρ€Π°Π²Π½Π° 9.

Допустим, Π½Π°ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΈΡΡŒ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ произвСдСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ большС 50:

ghci> [x*y | x <– [2,5,10], y <– [8,10,11], x*y > 50]

[55,80,100,110]

А ΠΊΠ°ΠΊ насчёт списка, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‰Π΅Π³ΠΎ элСмСнты списка ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… с элСмСнтами списка ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ…β€¦ с довольно Π·Π°Π±Π°Π²Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ?

ghci> let nouns = ["бродяга","Π»ΡΠ³ΡƒΡˆΠ°Ρ‚Π½ΠΈΠΊ","ΠΏΠΎΠΏ"]

ghci> let adjs = ["Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ","Π²ΠΎΡ€Ρ‡Π»ΠΈΠ²Ρ‹ΠΉ","Ρ…ΠΈΡ‚Ρ€Ρ‹ΠΉ"]

ghci> [adj ++ " " ++ noun | adj <– adjs, noun <– nouns]

["Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ бродяга","Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ Π»ΡΠ³ΡƒΡˆΠ°Ρ‚Π½ΠΈΠΊ","Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ ΠΏΠΎΠΏ",

"Π²ΠΎΡ€Ρ‡Π»ΠΈΠ²Ρ‹ΠΉ бродяга","Π²ΠΎΡ€Ρ‡Π»ΠΈΠ²Ρ‹ΠΉ Π»ΡΠ³ΡƒΡˆΠ°Ρ‚Π½ΠΈΠΊ", "Π²ΠΎΡ€Ρ‡Π»ΠΈΠ²Ρ‹ΠΉ ΠΏΠΎΠΏ",

"Ρ…ΠΈΡ‚Ρ€Ρ‹ΠΉ бродяга","Ρ…ΠΈΡ‚Ρ€Ρ‹ΠΉ Π»ΡΠ³ΡƒΡˆΠ°Ρ‚Π½ΠΈΠΊ","Ρ…ΠΈΡ‚Ρ€Ρ‹ΠΉ ΠΏΠΎΠΏ"]

Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ списков ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Π°ΠΆΠ΅ для написания своСй собствСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ length! Назовём Π΅Ρ‘ length': эта функция Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт списка Π½Π° 1, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ всС эти Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ просуммируСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ sum, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² Π΄Π»ΠΈΠ½Ρƒ списка:

length' xs = sum [1 | _ <– xs]

Π‘ΠΈΠΌΠ²ΠΎΠ» _ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½Π΅Π²Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ ΠΈΠ· списка, поэтому вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ имя ΠΎΠ±Ρ€Π°Π·Ρ†Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΌΡ‹ просто пишСм _. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ строки – это списки, Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ списков ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ создания строк. Π’ΠΎΡ‚ функция, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ строку ΠΈ удаляСт ΠΈΠ· Π½Π΅Ρ‘ всё, ΠΊΡ€ΠΎΠΌΠ΅ Π±ΡƒΠΊΠ² Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ рСгистрС:

removeNonUppercase st = [c | c <– st, c `elem` ['А'..'Π―']]

Π’ΡΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ здСсь выполняСт ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚: символ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒΡΡ Π² Π½ΠΎΠ²Ρ‹ΠΉ список, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΎΠ½ являСтся элСмСнтом списка ['А'..'Π―']. Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² GHCi ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ:

ghci> removeNonUppercase "Π₯Π°-Ρ…Π°-Ρ…Π°! А-Ρ…Π°-Ρ…Π°-Ρ…Π°!"

"Π₯А"

ghci> removeNonUppercase "Π―Π½Π΅Π•ΠœΠ›Π―Π“Π£Π¨Π•Πš"

"Π―Π•ΠœΠ›Π―Π“Π£Π¨Π•Πš"

Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ списков Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹, Ссли Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ со списками, содСрТащими Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ списки. Допустим, список содСрТит нСсколько списков чисСл. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ всС Π½Π΅Ρ‡Ρ‘Ρ‚Π½Ρ‹Π΅ числа, Π½Π΅ разворачивая список:

ghci> let xxs = [[1,3,5,2,3,1,2],[1,2,3,4,5,6,7],[1,2,4,2,1,6,3,1,3,2]]

ghci> [[x | x <– xs, even x ] | xs <– xxs]

[[2,2],[2,4,6],[2,4,2,6,2]]

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ списков Π² нСсколько строк. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ссли Π²Ρ‹ Π½Π΅ Π² GHCi, Π»ΡƒΡ‡ΡˆΠ΅ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ списков, особСнно Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅, Π½Π° нСсколько строк.

ΠšΠΎΡ€Ρ‚Π΅ΠΆΠΈ


ΠšΠΎΡ€Ρ‚Π΅ΠΆΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ нСсколько элСмСнтов Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ смыслС ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° списки, ΠΎΠ΄Π½Π°ΠΊΠΎ Π΅ΡΡ‚ΡŒ ΠΈ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ отличия. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ Π³Π΅Ρ‚Π΅Ρ€ΠΎΠ³Π΅Π½Π½Ρ‹, Ρ‚. Π΅. Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ элСмСнты Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ фиксированный Ρ€Π°Π·ΠΌΠ΅Ρ€: Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Ρ€Π°Π½Π΅Π΅ Π·Π½Π°Ρ‚ΡŒ, сколько ΠΈΠΌΠ΅Π½Π½ΠΎ элСмСнтов потрСбуСтся ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ.

ΠšΠΎΡ€Ρ‚Π΅ΠΆΠΈ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ ΠΊΡ€ΡƒΠ³Π»Ρ‹ΠΌΠΈ скобками, Π° ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΡΡŽΡ‚ΡΡ запятыми:

ghci> (1, 3)

(1,3)

ghci> (3, 'a', "ΠΏΡ€ΠΈΠ²Π΅Ρ‚")

(3,'a',"ΠΏΡ€ΠΈΠ²Π΅Ρ‚")

ghci> (50, 50.4, "ΠΏΡ€ΠΈΠ²Π΅Ρ‚", 'b')

(50,50.4,"ΠΏΡ€ΠΈΠ²Π΅Ρ‚",'b')

ИспользованиС ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ

ΠŸΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π±Ρ‹ ΠΌΡ‹ прСдставили Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€ Π² языкС Haskell. Один Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ – ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ список. Π­Ρ‚ΠΎ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ ΡΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ – Π½Ρƒ Π° Ссли Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ нСсколько Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² Π² список для прСдставлСния Ρ‚ΠΎΡ‡Π΅ΠΊ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ Π½Π° Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠΉ плоскости?.. ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ: [[1,2],[8,11],[4,5]].

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ язык Haskell Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π΅Ρ‡Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ [[1,2],[8,11,5],[4,5]] – вСдь это ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ список списков с числами. Но ΠΏΠΎ сути данная запись Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя ΠΊΠΎΡ€Ρ‚Π΅ΠΆ с двумя элСмСнтами (Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Β«ΠΏΠ°Ρ€ΠΎΠΉΒ») ΠΈΠΌΠ΅Π΅Ρ‚ свой собствСнный Ρ‚ΠΈΠΏ; это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ список Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ нСсколько ΠΏΠ°Ρ€, Π° ΠΏΠΎΡ‚ΠΎΠΌ Β«Ρ‚Ρ€ΠΎΠΉΠΊΡƒΒ» (ΠΊΠΎΡ€Ρ‚Π΅ΠΆ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° 3). Π”Π°Π²Π°ΠΉΡ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ этим Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ. ВмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Π΅ скобки, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅: [(1,2),(8,11),(4,5)]. А Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Π±Ρ‹, Ссли Π± ΠΌΡ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ: [(1,2),(8,11,5),(4,5)]? ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π±Ρ‹ ΠΎΡˆΠΈΠ±ΠΊΡƒ:

Couldn't match expected type `(t, t1)'

against inferred type `(t2, t3, t4)'

In the expression: (8, 11, 5)

In the expression: [(1, 2), (8, 11, 5), (4, 5)]

In the definition of `it': it = [(1, 2), (8, 11, 5), (4, 5)]

ΠœΡ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Ρƒ ΠΈ Ρ‚Ρ€ΠΎΠΉΠΊΡƒ Π² ΠΎΠ΄Π½ΠΎΠΌ спискС, ΠΈ нас ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‚: Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ. НСльзя ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ список Π²Ρ€ΠΎΠ΄Π΅ [(1,2),("Один",2)], ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт списка – это ΠΏΠ°Ρ€Π° чисСл, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ – ΠΏΠ°Ρ€Π°, состоящая ΠΈΠ· строки ΠΈ числа.

ΠšΠΎΡ€Ρ‚Π΅ΠΆΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для прСдставлСния ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π΄Π°Π½Π½Ρ‹Ρ…. НапримСр, Ссли Π±Ρ‹ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‡ΡŒΡ‘-Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя ΠΈ возраст Π² языкС Haskell, Ρ‚ΠΎ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Ρ€ΠΎΠΉΠΊΠΎΠΉ: ("ΠšΡ€ΠΈΡΡ‚ΠΎΡ„Π΅Ρ€", "Π£ΠΎΠΊΠ΅Π½", 69). Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ списки.