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

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

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

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ Π·Π°Ρ€Π°Π½Π΅Π΅, ΠΈΠ· ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… элСмСнтов Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ нСкоторая Ρ‡Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…. ΠšΠΎΡ€Ρ‚Π΅ΠΆΠΈ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΌΠ΅Π½Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ количСство ΠΈ Ρ‚ΠΈΠΏ элСмСнтов ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ Ρ‚ΠΈΠΏ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ элСмСнт Π² ΠΊΠΎΡ€Ρ‚Π΅ΠΆ – понадобится Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΊ ΠΏΠ°Ρ€Π΅, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΊ Ρ‚Ρ€ΠΎΠΉΠΊΠ΅, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΊ Ρ‡Π΅Ρ‚Π²Ρ‘Ρ€ΠΊΠ΅, ΠΈ Ρ‚. Π΄.

Как ΠΈ списки, ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ, Ссли ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹. Однако Π²Π°ΠΌ Π½Π΅ удастся ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² (хотя списки Ρ€Π°Π·Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ, Ссли ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… элСмСнты).

НСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ списки с ΠΎΠ΄Π½ΠΈΠΌ элСмСнтом, Π½Π΅ Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ с ΠΎΠ΄Π½ΠΈΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ. Если Π²Π΄ΡƒΠΌΠ°Ρ‚ΡŒΡΡ, это Π½Π΅ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. ΠšΠΎΡ€Ρ‚Π΅ΠΆ с СдинствСнным элСмСнтом Π±Ρ‹Π» Π±Ρ‹ просто Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ½ содСрТит, ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π΅ Π΄Π°Π²Π°Π» Π±Ρ‹ Π½Π°ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй[6].

ИспользованиС ΠΏΠ°Ρ€

Π’ΠΎΡ‚ Π΄Π²Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ°Ρ€Π°ΠΌΠΈ:

β€’ fst – ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Ρƒ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Ρ‘ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚.

ghci> fst (8,11)

8

ghci> fst ("Π’Π°Ρƒ", False)

"Π’Π°Ρƒ"

β€’ snd – ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Ρƒ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Ρ‘ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚. НСоТиданно!

ghci> snd (8,11)

11

ghci> snd ("Π’Π°Ρƒ", False)

False

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΠ°Ρ€Π°ΠΌΠΈ. Они Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ‚Ρ€ΠΎΠΉΠΊΠ°ΠΌΠΈ, Ρ‡Π΅Ρ‚Π²Ρ‘Ρ€ΠΊΠ°ΠΌΠΈ, пятёрками ΠΈ Ρ‚. Π΄. Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ ΠΌΡ‹ рассмотрим Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅.

Π—Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ функция, производящая список ΠΏΠ°Ρ€, – zip. Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° списка ΠΈ сводит ΠΈΡ… Π² ΠΎΠ΄ΠΈΠ½, группируя ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты Π² ΠΏΠ°Ρ€Ρ‹. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ простая, Π½ΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ полСзная функция. ОсобСнно ΠΎΠ½Π° ΠΏΠΎΠ»Π΅Π·Π½Π°, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π΄Π²Π° списка ΠΈΠ»ΠΈ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ Π΄Π²Π° списка ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρƒ zip:

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

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

ghci> zip [1 .. 5] ["ΠΎΠ΄ΠΈΠ½", "Π΄Π²Π°", "Ρ‚Ρ€ΠΈ", "Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅", "ΠΏΡΡ‚ΡŒ"]

[(1,"ΠΎΠ΄ΠΈΠ½"),(2,"Π΄Π²Π°"),(3,"Ρ‚Ρ€ΠΈ"),(4,"Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅"),(5,"ΠΏΡΡ‚ΡŒ")]

Ѐункция «спариваСт» элСмСнты ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Π½ΠΎΠ²Ρ‹ΠΉ список. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт ΠΈΠ΄Ρ‘Ρ‚ с ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, Π²Ρ‚ΠΎΡ€ΠΎΠΉ – со Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΈ Ρ‚. Π΄. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π½Π° это Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠ°Ρ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, функция zip ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Π΄Π²Π° списка, содСрТащих Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, ΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΈΡ…. А Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚, Ссли Π΄Π»ΠΈΠ½Π° списков Π½Π΅ совпадаСт?

ghci> zip [5,3,2,6,2,7,2,5,4,6,6] ["я","Π½Π΅","Ρ‡Π΅Ρ€Π΅ΠΏΠ°Ρ…Π°"]

[(5,"я"),(3,"Π½Π΅"),(2,"Ρ‡Π΅Ρ€Π΅ΠΏΠ°Ρ…Π°")]

Π‘ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ список просто обрСзаСтся Π΄ΠΎ Π΄Π»ΠΈΠ½Ρ‹ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ³ΠΎ! ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ язык Haskell Π»Π΅Π½ΠΈΠ², ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ бСсконСчный список с ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΌ:

ghci> zip [1..] ["яблоко", "апСльсин", "вишня", "манго"]

[(1,"яблоко"),(2,"апСльсин"),(3,"вишня"),(4,"манго")]

Π’ поисках ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠΌ Π³Π»Π°Π²Ρƒ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ, Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ пригодятся ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ списков, ΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ трСбуСтся Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰ΠΈΠΉ всСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ условиям:

β€’ Π΄Π»ΠΈΠ½Ρ‹ сторон ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами;

β€’ Π΄Π»ΠΈΠ½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ стороны мСньшС Π»ΠΈΠ±ΠΎ Ρ€Π°Π²Π½Π° 10;

β€’ ΠΏΠ΅Ρ€ΠΈΠΌΠ΅Ρ‚Ρ€ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ сумма Π΄Π»ΠΈΠ½ сторон) Ρ€Π°Π²Π΅Π½ 24.



Π’Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ называСтся ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ, Ссли ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΅Π³ΠΎ ΡƒΠ³Π»ΠΎΠ² являСтся прямым (Ρ€Π°Π²Π΅Π½ 90 градусам). ΠŸΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ свойством: Ссли возвСсти Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Π΄Π»ΠΈΠ½Ρ‹ сторон, ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰ΠΈΡ… прямой ΡƒΠ³ΠΎΠ», Ρ‚ΠΎ сумма этих ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² окаТСтся Ρ€Π°Π²Π½ΠΎΠΉ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρƒ стороны, ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΉ прямому ΡƒΠ³Π»Ρƒ. На рисункС стороны, ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰ΠΈΠ΅ прямой ΡƒΠ³ΠΎΠ», ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ Π±ΡƒΠΊΠ²Π°ΠΌΠΈ a ΠΈ b; сторона, противополоТная прямому ΡƒΠ³Π»Ρƒ, ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π° Π±ΡƒΠΊΠ²ΠΎΠΉ c. Π­Ρ‚Π° сторона называСтся Π³ΠΈΠΏΠΎΡ‚Π΅Π½ΡƒΠ·ΠΎΠΉ.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ построим всС Ρ‚Ρ€ΠΎΠΉΠΊΠΈ, элСмСнты ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… мСньшС Π»ΠΈΠ±ΠΎ Ρ€Π°Π²Π½Ρ‹ 10:

ghci> let triples = [(a,b,c) | c <– [1..10], b <– [1..10], a <– [1..10]]

ΠœΡ‹ просто собираСм вмСстС Ρ‚Ρ€ΠΈ списка, ΠΈ наша производящая функция ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ ΠΈΡ… Π² Ρ‚Ρ€ΠΎΠΉΠΊΠΈ. Если Π²Ρ‹ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ triples Π² GHCi, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ список ΠΈΠ· тысячи Ρ‚Ρ€ΠΎΠ΅ΠΊ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ условиС, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ Ρ‚Ρ€ΠΎΠΉΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π»ΠΈΠ½Π°ΠΌ сторон ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ². ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, приняв Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ сторона b Π½Π΅ большС Π³ΠΈΠΏΠΎΡ‚Π΅Π½ΡƒΠ·Ρ‹, ΠΈ сторона a Π½Π΅ большС стороны b.

ghci> let rightTriangles = [ (a,b,c) | c <– [1..10], b <– [1..c], a <– [1..b], a 2 + b 2 == c 2]

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. Π’ консоли ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° GHCi Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ сущности Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строках. Но Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅ Π½Π°ΠΌ ΠΈΠ½ΠΎΠ³Π΄Π° приходится Ρ€Π°Π·Π±ΠΈΠ²Π°Ρ‚ΡŒ опрСдСлСния Π½Π° нСсколько строк, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ΄ помСщался Π½Π° страницС. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΊΠ½ΠΈΠ³Π° оказалась Π±Ρ‹ Ρ‚Π°ΠΊΠΎΠΉ ΡˆΠΈΡ€ΠΎΠΊΠΎΡ„ΠΎΡ€ΠΌΠ°Ρ‚Π½ΠΎΠΉ, Ρ‡Ρ‚ΠΎ для Π½Π΅Ρ‘ Π²Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΠΊΡƒΠΏΠΈΡ‚ΡŒ гигантский ΠΊΠ½ΠΈΠΆΠ½Ρ‹ΠΉ ΡˆΠΊΠ°Ρ„!

ΠŸΠΎΡ‡Ρ‚ΠΈ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ, ΠΏΠ΅Ρ€ΠΈΠΌΠ΅Ρ‚Ρ€ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π²Π΅Π½ 24.

ghci> let rightTriangles' = [ (a,b,c) | c <– [1..10], b <– [1..c], a <– [1..b], a 2 + b 2 == c 2, a+b+c == 24]

ghci> rightTriangles'

[(6,8,10)]

Π’ΠΎΡ‚ ΠΈ ΠΎΡ‚Π²Π΅Ρ‚! Π­Ρ‚ΠΎ ΠΎΠ±Ρ‰ΠΈΠΉ шаблон Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ. Π’Ρ‹ Π±Π΅Ρ€Ρ‘Ρ‚Π΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΈ Π·Π°Ρ‚Π΅ΠΌ примСняСтС прСобразования ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅Ρ‚Π΅ ΠΈΡ…, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

2

Π’ΠΈΠΏΡ‹ ΠΈ классы Ρ‚ΠΈΠΏΠΎΠ²

ΠŸΠΎΠ²Π΅Ρ€ΡŒ Π² Ρ‚ΠΈΠΏΡ‹


ΠœΡ‹ ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Haskell являСтся статичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ языком. Π’ΠΈΠΏ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ выраТСния извСстСн Π²ΠΎ врСмя компиляции – это Π·Π°Π»ΠΎΠ³ бСзопасного ΠΊΠΎΠ΄Π°. Если Π²Ρ‹ Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая попытаСтся ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒ булСвский Ρ‚ΠΈΠΏ Π½Π° число, Ρ‚ΠΎ ΠΎΠ½Π° Π΄Π°ΠΆΠ΅ Π½Π΅ скомпилируСтся.

И Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΡƒΠΆ Π»ΡƒΡ‡ΡˆΠ΅ Π»ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ошибки Π½Π° этапС компиляции, Ρ‡Π΅ΠΌ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ закрываСтся Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹! ВсСму Π² языкС Haskell Π½Π°Π·Π½Π°Ρ‡Π΅Π½ свой Ρ‚ΠΈΠΏ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ довольно ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ² ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠ΅Ρ€Π΅Π΄ Π΅Ρ‘ компиляциСй.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ языков Java ΠΈΠ»ΠΈ Pascal, Ρƒ Haskell Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚ΠΈΠΏΠΎΠ². Если ΠΌΡ‹ напишСм число, Ρ‚ΠΎ Π½Π΅Ρ‚ нСобходимости ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это число. Π―Π·Ρ‹ΠΊ Haskell ΠΌΠΎΠΆΠ΅Ρ‚ вывСсти это сам, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½Π΅ приходится явно ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

ΠœΡ‹ ΠΈΠ·ΡƒΡ‡ΠΈΠ»ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ основы языка, лишь вскользь упомянув ΠΎ Ρ‚ΠΈΠΏΠ°Ρ…. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ систСмы Ρ‚ΠΈΠΏΠΎΠ² – ΠΎΡ‡Π΅Π½ΡŒ ваТная Ρ‡Π°ΡΡ‚ΡŒ обучСния языку Haskell.

Π’ΠΈΠΏ – это Π½Π΅Ρ‡Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ ярлыка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅ΡΡ‚ΡŒ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ выраТСния. Он Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Π½Π°ΠΌ, ΠΊ ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ относится Π΄Π°Π½Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ True – Π±ΡƒΠ»Π΅Π²ΠΎ, "ΠΏΡ€ΠΈΠ²Π΅Ρ‚" – это строка, ΠΈ Ρ‚. Π΄.

Π―Π²Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ²

А сСйчас Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ GHCi для опрСдСлСния Ρ‚ΠΈΠΏΠΎΠ² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. ΠœΡ‹ сдСлаСм это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ :t, которая, Ссли Π·Π° Π½Π΅ΠΉ слСдуСт любоС ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, выдаст Π½Π°ΠΌ Ρ‚ΠΈΠΏ послСднСго. Π˜Ρ‚Π°ΠΊβ€¦

ghci> :t 'a'

'a' :: Char

ghci> :t True

True :: Bool

ghci> :t "ΠŸΠ Π˜Π’Π•Π’!"

"ΠŸΠ Π˜Π’Π•Π’!" :: [Char]

ghci> :t (True, 'a')

(True, 'a') :: (Bool, Char)

ghci> :t 4 == 5

4 == 5 :: Bool



ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ :t ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ выраТСния, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ :: ΠΈ ΠΈΡ… Ρ‚ΠΈΠΏ. Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ :: ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚: Β«ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏΒ». Π£ явно ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ всСгда Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ рСгистрС. Π‘ΠΈΠΌΠ²ΠΎΠ» 'a', ΠΊΠ°ΠΊ Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Char. НСслоТно ΡΠΎΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ это сокращСниС ΠΎΡ‚ Β«characterΒ» – символ. ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° True ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Bool. Выглядит логично… Π˜Π΄Ρ‘ΠΌ дальшС.

Π˜ΡΡΠ»Π΅Π΄ΡƒΡ Ρ‚ΠΈΠΏ "ΠŸΠ Π˜Π’Π•Π’!", ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ [Char]. ΠšΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Π΅ скобки ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° список – ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°ΠΌΠΈ «список символов». Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ списков, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ любой Π΄Π»ΠΈΠ½Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚ свой Ρ‚ΠΈΠΏ. Π’Π°ΠΊ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (True, 'a') ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ (Bool, Char), Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ('a','b','c') Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ (Char, Char, Char). Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 4==5 всСгда Π²Π΅Ρ€Π½Ρ‘Ρ‚ False, поэтому Π΅Π³ΠΎ Ρ‚ΠΈΠΏ – Bool.

Π£ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚ΠΎΠΆΠ΅ Π΅ΡΡ‚ΡŒ Ρ‚ΠΈΠΏΡ‹. Когда ΠΌΡ‹ пишСм свои собствСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… Ρ‚ΠΈΠΏ явно. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это считаСтся Π½ΠΎΡ€ΠΌΠΎΠΉ, ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ случаи написания ΠΎΡ‡Π΅Π½ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π—Π΄Π΅ΡΡŒ ΠΈ Π΄Π°Π»Π΅Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ для всСх создаваСмых Π½Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ списка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ использовали Ρ€Π°Π½Π΅Π΅: ΠΎΠ½ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Π» строку Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΎΡΡ‚Π°Π²Π°Π»ΠΈΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ прописныС Π±ΡƒΠΊΠ²Ρ‹? Π’ΠΎΡ‚ ΠΊΠ°ΠΊ это выглядит с объявлСниСм Ρ‚ΠΈΠΏΠ°:

removeNonUppercase :: [Char] –> [Char]

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

Ѐункция removeNonUppercase ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ [Char] –> [Char]. Π­Ρ‚Π° запись ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ строку Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π² качСствС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.

А ΠΊΠ°ΠΊ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ нСсколько ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²? Π’ΠΎΡ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, простая функция, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π°Ρ Ρ‚Ρ€ΠΈ Ρ†Π΅Π»Ρ‹Ρ… числа ΠΈ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‰Π°Ρ ΠΈΡ…:

addThree :: Int –> Int –> Int –> Int