ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² ΡƒΡ‡Ρ‘Π±Π΅, ΠΎΡ‡Π΅Π½ΡŒ быстро...
Π Π°Π±ΠΎΡ‚Π°Π΅ΠΌ вмСстС Π΄ΠΎ ΠΏΠΎΠ±Π΅Π΄Ρ‹

Π’Π΅Ρ…Π½ΠΈΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ со списками

Π Π΅Ρ„Π΅Ρ€Π°Ρ‚ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Бписки ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΡƒΡ‚Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ присоСдинСния элСмСнтов ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ списка с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ — конструктора списков, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Π²ΠΈΠ΄Π΅ двоСточия. НапримСр, Ссли Ρ… — список ΠΈΠ· Ρ†Π΅Π»Ρ‹Ρ… чисСл, Ρ€Π°Π²Π½Ρ‹ΠΉ, Ρ‚ΠΎ ΠΊΠΎΠ½ΡΡ‚рукция 1: Ρ… ΡΠΎΠ·Π΄Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ список, элСмСнтами ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ числа 1, 2, 3, 4. Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ списка Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° элСмСнтов всСгда… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Π’Π΅Ρ…Π½ΠΈΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ со списками (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Π’ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… языках программирования для построСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π±ΠΎΠ»Π΅Π΅ слоТных, Ρ‡Π΅ΠΌ элСмСнтарныС числа ΠΈΠ»ΠΈ логичСскиС значСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ встроСнныС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ для построСния слоТных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ· Π±ΠΎΠ»Π΅Π΅ простых. НапримСр, Π² ΡΠ·Ρ‹ΠΊΠ΅ Паскаль для этого ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ записи, массивы ΠΈ ΡΠΏΠΈΡΠΊΠΎΠ²Ρ‹Π΅ структуры, Π° Π² ΡΠ·Ρ‹ΠΊΠ°Ρ… Java, C# ΠΈ C++ основным ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ построСния слоТных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΡΠ²Π»ΡΡŽΡ‚ΡΡ классы. Аналогом паскалСвской записи Π² ΡΠ·Ρ‹ΠΊΠ΅ Haskell являСтся ΠΊΠΎΡ€Ρ‚Π΅ΠΆ, структуру ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ ΡƒΠΆΠ΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ описывали Π²Ρ‹ΡˆΠ΅. ΠŸΡ€Π°Π²Π΄Π°, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠŸΠ°ΡΠΊΠ°Π»Ρ Π² ΡΠ·Ρ‹ΠΊΠ΅ Haskell поля Π² ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°Ρ… Ρ‡Π°Ρ‰Π΅ всСго Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΈΠΌΠ΅Π½ ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ся лишь ΠΏΠΎ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡΠΌ Π² ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅. ИмСна для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π² ΡΠ·Ρ‹ΠΊΠ΅ Haskell, Π½ΠΎ ΡΡ‚Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Haskell ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅Π΄ΠΊΠΎ.

Бпособов построСния массивов Π² ΡΠ·Ρ‹ΠΊΠ΅ Haskell Π½Π΅Ρ‚. Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… Array, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Data. Array, лишь внСшнС ΠΏΠΎΡ…ΠΎΠΆ Π½Π° ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΉ массив, Π° Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π΅Π³ΠΎ структура устроСна ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° этого состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ трСбуСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ этого массива Π²Π΅Π»ΠΈ сСбя ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Π½ΠΎ ΡΡ‚ΠΎ ΠΏΠ»ΠΎΡ…ΠΎ соотвСтствуСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΡΡ‚ΠΈΠ»ΡŽ. Π—Π°Ρ‚ΠΎ Π² ΡΠ·Ρ‹ΠΊΠ΅ Haskell имССтся ΠΎΠ΄ΠΈΠ½ способ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ структуры Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ стСпСни слоТности ΠΈΠ· Π±ΠΎΠ»Π΅Π΅ простых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², — списки.

Бписки Π² Haskell ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‚ ΠΈ ΡΠΏΠΈΡΠΊΠΎΠ²Ρ‹Π΅ структуры Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… языков программирования, ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ массивы. Бписок — это ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, состоящая ΠΈΠ· ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ числа ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ — ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ список называСтся пустым). Π’ΠΈΠΏ списка опрСдСляСтся Ρ‚ΠΈΠΏΠΎΠΌ Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈ Π² ΡΠ·Ρ‹ΠΊΠ΅ Haskell обозначаСтся [Π’], Π³Π΄Π΅ Π’ — Ρ‚ΠΈΠΏ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² списка. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, [Integer] Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ списка, содСрТащСго Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Ρ†Π΅Π»Ρ‹Π΅ числа, Π° [ ([Char], Double) ] — это Ρ‚ΠΈΠΏ списка, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ ΠΈΠ· Π΄Π²ΡƒΡ… ΠΏΠΎΠ»Π΅ΠΉ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠΎΠ»Π΅ΠΌ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ список символов, Π° Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠΎΠ»Π΅ΠΌ — вСщСствСнноС число.

Π‘Π°ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹-списки Π² ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌ случаС Π·Π°Π΄Π°ΡŽΡ‚ΡΡ пСрСчислСниСм своих ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобках Ρ‡Π΅Ρ€Π΅Π· Π·Π°ΠΏΡΡ‚ΡƒΡŽ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, [ 1, 3, 4, 8 ] — это Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ…ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π½Ρ‹ΠΉ список Ρ†Π΅Π»Ρ‹Ρ… чисСл (Ρ‚ΠΈΠΏΠΎΠΌ этого списка Π±ΡƒΠ΄Π΅Ρ‚ Num t=> [ t ]), Π° [ ([1 Ρ€', ' i ' ], 3.14), ([1 Π΅1 ],.

2.72)] — список Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° [ ([Char], Double) ]. Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ запись, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ списка Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², синтаксичСски Π½Π΅Π²Π΅Ρ€Π½Π°, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ, скаТСм, [ 3, 4, ' * 1 ] Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ списка, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π΄Π²Π΅ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ — это числа, Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΡ — символ.

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ Π΄Π²Π° ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… сокращСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ…ΡΡ для записи списков. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, список, состоящий ΠΈΠ· ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ строки, Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΠ² ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π΅Π³ΠΎ символы Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ. НапримСр, строка «Haskell» ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ список ΠΈΠ· ΡΠ΅ΠΌΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΈ Ρ‚акая запись ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ эквивалСнтна Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΉ записи: [ 1 Н ', 'a1, 's', ' k', ' Π΅', ' 1', '1']. Для списков символов Π² ΡΠ·Ρ‹ΠΊΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚ΠΈΠΏΠ° — String, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π»ΡŽΠ±ΠΎΠΌ мСстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ вмСсто [Char].

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Π°Π±Π·Π°Ρ†Π° ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ: список [(«pi», 3.14), («Π΅ΠΏ, 2.72)] являСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠ°.

[ (String, Double)].

Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ΅ сокращСниС ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅, скорСС, срСдство построСния списков — это Π·Π°Π΄Π°Π½ΠΈΠ΅ списка чисСл, ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰ΠΈΡ… Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π΅ΡΡΠΈΡŽ. Если шаг прогрСссии Ρ€Π°Π²Π΅Π½ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ элСмСнты списка, Ρ€Π°Π·Π΄Π΅Π»ΠΈΠ² ΠΈΡ… ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ ΠΈΠ· Π΄Π²ΡƒΡ… Ρ‚ΠΎΡ‡Π΅ΠΊ. Π’Π°ΠΊ, [1. .10] ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ список ΠΈΠ· 10 ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½Ρ‹Ρ… чисСл ΠΎΡ‚ 1 Π΄ΠΎ 10. Если шаг прогрСссии Π½Π΅ Ρ€Π°Π²Π΅Π½ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅, Ρ‚ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π΄Π²Π° ΠΏΠ΅Ρ€Π²Ρ‹Ρ… элСмСнта списка ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ элСмСнт. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ списка [ 3, 5.. 11 ] Π·Π°Π΄Π°Π΅Ρ‚ список ΠΈΠ· ΠΏΡΡ‚ΠΈ Ρ†Π΅Π»Ρ‹Ρ… чисСл 3, 5, 7, 9 ΠΈ 11. ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ эта запись ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ Π΄Π»Ρ задания списков с Ρ‡ΠΈΡΠ»ΠΎΠΌ элСмСнтов, нСизвСстным Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. НапримСр, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ [ 1.. ΠΏ] ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ для создания списка ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½Ρ‹Ρ… чисСл ΠΎΡ‚ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ Π΄ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ значСния ΠΏ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π² Ρ€Π°Π·Π½Ρ‹Ρ… ситуациях ΠΏΡ€ΠΈ исполнСнии ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ. ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ списка ΠΏΡ€ΠΎΠ³Ρ€Π΅ΡΡΠΈΡŽ с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ элСмСнтами, Π½Π΅ Π²Ρ…одящими Π² ΠΏΡ€ΠΎΠ³Ρ€Π΅ΡΡΠΈΡŽ, нСльзя. НапримСр, запись [3, 5. .13, 14] Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ.

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ остороТным ΠΏΡ€ΠΈ составлСнии арифмСтичСской прогрСссии ΠΈΠ· Π²Π΅Ρ‰Π΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Ρ… чисСл. ВычислСния Π² Π²Π΅Ρ‰Π΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Ρ… числах происходят ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½Π½ΠΎ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π² ΡΠ·Ρ‹ΠΊΠ΅ считаСтся, Ρ‡Ρ‚ΠΎ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π΅ΡΡΠΈΡŽ слСдуСт Ρ‚Π΅ΠΌ элСмСнтом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Π»ΠΈΠΆΠ΅ всСго ΠΊ Π·Π°ΡΠ²Π»Π΅Π½Π½ΠΎΠΉ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅ списка. Π’ Ρ†Π΅Π»Ρ‹Ρ… числах, Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ², вычислСния всСгда производятся Ρ‚ΠΎΡ‡Π½ΠΎ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ список [0,3. .11] Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ элСмСнта: [ 0, 3, 6, 9] (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ элСмСнт 12 ΡƒΠΆΠ΅ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ). А Π²ΠΎΡ‚ список [0,0.3. .1.1] Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΡƒΠΆΠ΅ ΠΏΡΡ‚ΡŒ элСмСнтов [ 0.0, 0.3, 0.6, 0.89 999, 1.19 999], ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ послСднСго элСмСнта 1.19 999 Π±Π»ΠΈΠΆΠ΅ ΠΊ Π·Π°ΡΠ²Π»Π΅Π½Π½ΠΎΠΉ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅ 1.1, Ρ‡Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ прСдпослСднСго элСмСнта.

Бписки ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΡƒΡ‚Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ присоСдинСния элСмСнтов ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ списка с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ — конструктора списков, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Π²ΠΈΠ΄Π΅ двоСточия. НапримСр, Ссли Ρ… — список ΠΈΠ· Ρ†Π΅Π»Ρ‹Ρ… чисСл, Ρ€Π°Π²Π½Ρ‹ΠΉ [2,3, 4 ], Ρ‚ΠΎ ΠΊΠΎΠ½ΡΡ‚рукция 1: Ρ… ΡΠΎΠ·Π΄Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ список, элСмСнтами ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ числа 1, 2, 3, 4. Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ списка Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° элСмСнтов всСгда ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора списков. НапримСр, список [ 2, 3, 4 ] ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ записан Π² Π²ΠΈΠ΄Π΅ 2: (3: (4: [])).Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ конструктор (:) «ΠΏΡ€Π°Π²ΠΎΠ°ΡΡΠΎΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π΅Π½», Ρ‚. Π΅. связываниС ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² происходит Π½Π΅ ΡΠ»Π΅Π²Π° Π½Π°ΠΏΡ€Π°Π²ΠΎ, ΠΊΠ°ΠΊ Ρƒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Π° ΡΠΏΡ€Π°Π²Π° Π½Π°Π»Π΅Π²ΠΎ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ 2:3:4: [ ] построСниС списка происходит «ΡΠΏΡ€Π°Π²Π° Π½Π°Π»Π΅Π²ΠΎ», Ρ‚. Π΅. ΠΎΡ‚ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ элСмСнта ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ. Π’ ΡΡ‚ΠΎΠΉ записи использована Ρ‚Π°ΠΊΠΆΠ΅ константа [ ], ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰Π°Ρ пустой список.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ списков, Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ, — это Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Они ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚, скаТСм, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ арифмСтичСского слоТСния Ρ†Π΅Π»Ρ‹Ρ… Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ «Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΠ΅Ρ‚» Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния, Π° ΠΏΡ€ΠΎΡΡ‚ΠΎ собираСт слоТный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ· Π±ΠΎΠ»Π΅Π΅ простых. Π­Ρ‚ΠΈ Π±ΠΎΠ»Π΅Π΅ простыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π² ΡΠΎΡΡ‚Π°Π²Π΅ списка ΠΈΠ»ΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΎΡ‚Ρ‚ΡƒΠ΄Π° ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, Π² Ρ‚ΠΎ Π²Ρ€Π΅ΠΌΡ ΠΊΠ°ΠΊ послС слоТСния числа 3 с Ρ‡ΠΈΡΠ»ΠΎΠΌ 5 получаСтся Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ — число 8, Π² ΡΠΎΡΡ‚Π°Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½ΠΈΠΊΠΎΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π΅ Π²Ρ…одят Π½ΠΈ Ρ‚Ρ€ΠΎΠΉΠΊΠ°, Π½ΠΈ ΠΏΡΡ‚Π΅Ρ€ΠΊΠ°. Π’Π°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ лишь ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² Π½ΠΎΠ²Ρ‹ΠΉ составной ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ конструкторами, ΠΈ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ списков — это лишь частный случай Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅Π³ΠΎ понятия конструктора. Π’ Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅ΠΌ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ изобраТСния константных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ (Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹) Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ конструкторы, ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠ΅ элСмСнтарныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, список, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ пСрСчислСниСм своих элСмСнтов, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π΄Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ примСнСния Π΄Π²ΡƒΡ… конструкторов — двоСточия ΠΈ ΠΏΡƒΡΡ‚ΠΎΠ³ΠΎ списка.

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

Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ встроСнных Π² ΡΠ·Ρ‹ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ списков. Π’ΠΎΡ‚ ваТнСйшиС ΠΈΠ· Π½ΠΈΡ…:

  • β€’ head, last — Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ-списку Π²Ρ‹Π΄Π°ΡŽΡ‚ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ элСмСнты соотвСтствСнно. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ Π½Π΅ΠΏΡƒΡΡ‚ΠΎΠΌΡƒ списку;
  • β€’ tail — функция, Π²Ρ‹Π΄Π°ΡŽΡ‰Π°Ρ остаток списка, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ отбрасываниСм ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта. Аналогично функция init Π²Ρ‹Π΄Π°Π΅Ρ‚ список Π±Π΅Π· послСднСго элСмСнта. ОбС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ ΠΊ ΠΏΡƒΡΡ‚ΠΎΠΌΡƒ списку;
  • β€’ ! ! — ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ, которая ΠΏΠΎ ΡΠΏΠΈΡΠΊΡƒ ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ Π½ΠΎΠΌΠ΅Ρ€Ρƒ элСмСнта

Π²Ρ‹Π΄Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт списка. Бписок Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ нСпустым, Π° Π½ΠΎΠΌΠ΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π»Π΅ΠΆΠ°Ρ‚ΡŒ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΡ‚ Π½ΡƒΠ»Ρ (ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт списка ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ ноль) Π΄ΠΎ ΠΊΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²Π° элСмСнтов списка Π±Π΅Π· Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹. НапримСр, вычислСниС конструкции [1, 2, 3, 4] !! 2 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π²Ρ‹Π΄Π°Ρ‡Π΅ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° числа 3 — элСмСнта списка, ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π³ΠΎ Π½ΠΎΠΌΠ΅Ρ€ 2;

  • β€’ null — функция ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ пустоты списка. Если Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π΄Π°Π½ пустой список, Ρ‚ΠΎ Ρ„ункция выдаст Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС — False;
  • β€’ length — функция, Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‰Π°Ρ количСство элСмСнтов Π² ΡΠΏΠΈΡΠΊΠ΅ (Π΄Π»ΠΈΠ½Ρƒ списка). Если Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ — пустой список, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ноль;
  • β€’ ++ — опСрация соСдинСния Π΄Π²ΡƒΡ… списков. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ примСнСния этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊ Π΄Π²ΡƒΠΌ спискам ΠΈΠ· ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ° получаСтся Π½ΠΎΠ²Ρ‹ΠΉ список ΠΈΠ· ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, составлСнный ΠΈΠ· ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ списка, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ элСмСнты Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ списка. Часто эта опСрация ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для соСдинСния (ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ) Π΄Π²ΡƒΡ… строк.

Π—Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠ΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ· ΡΡ‚ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ вычислСниС суммы элСмСнтов списка. ΠžΡ„ΠΎΡ€ΠΌΠΈΠΌ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Π²ΠΈΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sumList, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π΅ΠΉ список ΠΈΠ· Ρ†Π΅Π»Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ Π²Ρ‹Π΄Π°ΡŽΡ‰Π΅ΠΉ ΠΈΡ… ΡΡƒΠΌΠΌΡƒ (листинг 2.10).

Листинг 2.10. Π‘ΡƒΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ элСмСнтов списка.

— Ρ„ункция суммирования элСмСнтов цСлочислСнного списка. sumList: [Integer] -> Integer sumList s | null s = 0.

| otherwise = head s + sumList (tail s).

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΈ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sumList Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ s «Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ся Π½Π° Ρ‡Π°ΡΡ‚ΠΈ» ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ head ΠΈ tail. НСт нСобходимости Π΄Π΅Π»Π°Ρ‚ΡŒ Π΄Π²Π°ΠΆΠ΄Ρ‹ Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ списка. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ любой список «ΡΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚ΡΡ» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора списков, Ρ‚ΠΎ ΠΈ Π΅Π³ΠΎ «Ρ€Π°Π·Π±ΠΎΡ€ΠΊΡƒ» достаточно ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· — Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт ΠΈ ΠΎΡΡ‚Π°Ρ‚ΠΎΠΊ списка. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π° сопоставлСния с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π² ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΈ для опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ записываСтся «ΠΎΠ±Ρ€Π°Π·Π΅Ρ†» — Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ΠΎΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ части списка — Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт ΠΈ ΠΎΡΡ‚Π°Ρ‚ΠΎΠΊ — ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ. НапримСр, Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sumList ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ: sumList (x:xs) = Ρ… + sumList xs.

Если Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ нСпустой список, Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ сопоставлСниС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ (x:xs). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ нСпустой список всСгда ΠΈΠΌΠ΅Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΡƒ, ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΡƒΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора списка (явно ΠΈΠ»ΠΈ нСявно), Ρ‚ΠΎ ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΉΠ΄Π΅Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ сопоставлСния ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ «Ρ€Π°Π·Π±ΠΎΡ€ΠΊΠ°» списка Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт (Π³ΠΎΠ»ΠΎΠ²Ρƒ) ΠΈ ΠΎΡΡ‚Π°Ρ‚ΠΎΠΊ (хвост) списка. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ… Π½Π°Ρ‡Π½Π΅Ρ‚ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π³ΠΎΠ»ΠΎΠ²Ρ‹, a xs — хвост списка. Π’ ΠΏΡ€Π°Π²ΠΎΠΉ части уравнСния эти ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ рСкурсивном Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ слоТСния Ρ†Π΅Π»Ρ‹Ρ….

ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ сопоставлСния с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΎΠ±Ρ€Π°Π·Ρ†Π° Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ пустой список. БопоставлСниС с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ Π² ΡΡ‚ΠΎΠΌ случаС Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΌ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°Π΄Π°Π½ пустой список. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ тСкст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Π»ΠΈΡΡ‚ΠΈΠ½Π³Π΅ 2.11.

Листинг 2.11. Π‘ΡƒΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ элСмСнтов списка.

— Ρ„ункция суммирования элСмСнтов цСлочислСнного списка.

sumList: [Integer] -> Integer.

sumList [] =0.

sumList (x:s) = x + sumList s.

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sumList ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡƒΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ элСмСнты, начиная с ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΠΏΠΎ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ списка. Для этого вмСсто выраТСния head s + sumList (tail s) Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ last s + sumList (init s). Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ ΡΡƒΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ элСмСнты с ΠΊΠΎΠ½Ρ†Π° Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ конструктор списков асиммСтричный: ΠΎΠ½ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт ΠΊ ΠΎΡΡ‚Π°Ρ‚ΠΊΡƒ списка, Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ послСдний элСмСнт ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ списка. На ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΈ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅, нСсмотря Π½Π° ΠΊΠ°ΠΆΡƒΡ‰ΡƒΡŽΡΡ Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒ измСнСния порядка суммирования, суммированиС всС ΠΆΠ΅ слСдуСт ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° списка ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ last ΠΈ init Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ сущСствСнно дольшС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ head ΠΈ tail ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ большС памяти. ЀактичСски каТдая ΠΈΠ· ΡΡ‚ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ просматриваСт вСсь список ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°, Π° Ρ„ункция init Π΅Ρ‰Π΅ ΠΈ ΡΡ‚Ρ€ΠΎΠΈΡ‚ Π·Π°Π½ΠΎΠ²ΠΎ список ΠΈΠ· Π²ΡΠ΅Ρ… Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Ρ… элСмСнтов! Π’ ΡΡ‚ΠΎΠΌ Π»Π΅Π³ΠΊΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ссли ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядят, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, основныС Π΄Π²Π° уравнСния Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ init: init [Ρ…] = [].

init (x:xs) = Ρ…: init xs.

Напротив, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ head ΠΈ tail Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ просто с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° сопоставлСния с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ ΠΈ Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ»ΠΈ рСкурсивных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²: head (x:xs) = Ρ….

tail (x:xs) = xs.

ЀактичСски Π²ΠΎ Π²ΡΠ΅Ρ… функциях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΠ»ΠΈ Π΄ΠΎ ΡΡ‚ΠΎΠ³ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сопоставлСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ. ΠŸΡ€Π°Π²Π΄Π°, Ссли «ΠΎΠ±Ρ€Π°Π·Π΅Ρ†» состоит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ρ‚ΠΎ ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΌ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ сопоставлСно с ΡΡ‚ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π’ ΡΠ»ΡƒΡ‡Π°Π΅ ΠΎΠ±Ρ€Π°Π·Ρ†Π°-константы (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, числа 0, ΠΊΠ°ΠΊ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ вычислСния Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π° ΠΈΠ»ΠΈ пустого списка [ ], ΠΊΠ°ΠΊ Π² Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ суммирования элСмСнтов списка) сопоставлСниС Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° фактичСский Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ прСдставляСт собой эту константу. Если функция ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сСрии ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ, Ρ‚ΠΎ ΡΠΎΠΏΠΎΡΡ‚авлСния с ΠΎΠ±Ρ€Π°Π·Ρ†Π°ΠΌΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ сопоставлСния. Π’ΠΎΠ³Π΄Π° (ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΡ‚ΠΎΡ€ΠΎΠΆΠ΅ΠΉ Π²Ρ‹Π΄Π°Π» истинный Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚) Π² ΠΏΡ€Π°Π²ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ уравнСния Π±ΡƒΠ΄ΡƒΡ‚ подставлСны Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ сопоставлСния с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ, ΠΈ Ρ€Π΅Π΄ΡƒΠΊΡ†ΠΈΡ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°.

ΠŸΡ€ΠΈ составлСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ списков слСдуСт ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ встроСнных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ списками. Π’ ΡΠ»ΡƒΡ‡Π°Π΅ сомнСний ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ΡΡŒ ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ. Π’ Π½Π΅ΠΉ Π½Π΅ΠΏΡ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ написано, Ρ‡Ρ‚ΠΎ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ length, init, last ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (++) Π΅ΡΡ‚ΡŒ 0(ΠΏ), Ρ‚. Π΅. Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ зависит ΠΎΡ‚ Π΄Π»ΠΈΠ½Ρ‹ списка-Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Рассмотрим, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ соСдинСния списков. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ записи ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ: функция прСдставлСна инфиксной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ, поэтому Π² Π»Π΅Π²Ρ‹Ρ… частях ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π² ΠΈΠ½Ρ„иксной Ρ„ΠΎΡ€ΠΌΠ΅:

[ ] ++ S = S.

(x:sl) ++ s2 = Ρ…: (si ++ s2).

Π’ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ это рСкурсивная функция, ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ зависит ΠΎΡ‚ Π΄Π»ΠΈΠ½Ρ‹ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.

ΠœΡ‹ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π»ΠΈ для описываСмых встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΡ… Ρ‚ΠΈΠΏΡ‹. ЀактичСски Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ списки нСзависимо ΠΎΡ‚ Ρ‚ΠΈΠΏΠΎΠ² ΠΈΡ… ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠ²; Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΈΠΏΡ‹ этих списков «ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Π»ΠΈ» Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ. НапримСр, Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ соСдинСния списков (++) Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ списками ΠΈΠ· ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ список с ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ самого Ρ‚ΠΈΠΏΠ°. Для Ρ‚Π°ΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠ½Π°, указывая для Ρ‚Π΅Ρ… Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ, ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ length: length:: [Π°] -> Int.

Π’ ΡΡ‚ΠΎΠΌ описании использована пСрСмСнная Ρ‚ΠΈΠΏΠ° Π°, фактичСски это описаниС Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ length ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ список, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число. Π‘Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ‚ΠΈΠΏ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ соСдинСния списков Π±ΡƒΠ΄Π΅Ρ‚ описан ΠΊΠ°ΠΊ.

(++):: [Π°] -> [Π°] -> [Π°].

Π˜Π½Ρ‹ΠΌΠΈ словами, Π΄Π²Π° ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ списками элСмСнтов ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ° (ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ Π°), ΠΏΡ€ΠΈ этом Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ списком с ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, Ρ‡Ρ‚ΠΎ ΠΈ Ρƒ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ². Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠ° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ°, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Ρ‹ΠΌΠΈ. ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Π°Ρ функция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ‚ΠΈΠ½Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ описания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ примСнСния этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ.

ОпишСм Ρ‚ΠΈΠΏΡ‹ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… пСрСчислСнных Π²Ρ‹ΡˆΠ΅ встроСнных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ² Π² ΡΡ‚ΠΎΡ‚ список Π΅Ρ‰Π΅ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sum, которая являСтся ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ΠΌ написанной Π½Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sumList, ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ product, Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ элСмСнтов списка (ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ элСмСнтов пустого списка Ρ€Π°Π²Π½ΠΎ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅): head, tail:: [Π°] -> Π° init, last:: [Π°] -> [Π°] null:: [Π°] -> Bool.

(! !):: [Π°] -> Int -> Π°.

sum, product:: Num, Π° => [Π°] -> Π° ΠžΠΏΠΈΡˆΠ΅ΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ списков, которая, получая список Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ своСго Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π²Ρ‹Π΄Π°Π΅Ρ‚ список с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ элСмСнтами, Π½ΠΎ Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ Π² ΡΡ‚ΠΎΠΌ спискС Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС (ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ списка). Π’ Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сопоставлСния с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ «Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ» исходный список Π½Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹, ΠΎΠ΄Π½Π°ΠΊΠΎ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π΅Π³ΠΎ придСтся ΡƒΠΆΠ΅ Π½Π΅ Ρ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора списков, Π° ΠΏΠΎΡΡ€Π΅Π΄ΡΡ‚Π²ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ соСдинСния списков. ВСкст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² Π»ΠΈΡΡ‚ΠΈΠ½Π³Π΅ 2.12.

Листинг 2.12. ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ списка

— ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ списка.

reverse:: [Π°] -> [Π°].

reverse [] = [].

reverse (x:s) = reverse s ++ [x].

Если Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ тСкст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ врСмя Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρƒ Π΄Π»ΠΈΠ½Ρ‹ списка-Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, это слишком ΠΌΠ½ΠΎΠ³ΠΎ; ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ ясно, Ρ‡Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π·Π° Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ врСмя. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π»Π΅Π³ΠΊΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Для этого придСтся ввСсти Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ вСрсиСй ΠΈΠΌΠ΅Ρ‚ΡŒ лишний Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚. Новая вСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΈΠ΄, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² Π»ΠΈΡΡ‚ΠΈΠ½Π³Π΅ 2.13.

Листинг 2.13. Π‘ΠΎΠ»Π΅Π΅ эффСктивный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ обращСния списка.

— ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ списка.

reverse:: [Π°] -> [Π°].

reverse s = reverse' [] s.

  • — Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reverse'
  • — ΡΠ»ΡƒΠΆΠΈΡ‚ для накоплСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° reverse': [Π°] -> [Π°] -> [Π°]

reverse' s [] = s.

reverse' si (x:s2) = reverse' (x:sl) s2.

Π­Ρ‚ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡƒΠΆΠ΅ Π·Π° Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΏΠΎ Π΄Π»ΠΈΠ½Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° врСмя. ОписаниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reverse Ρ‚Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Haskell, Π½ΠΎ Π΅ΡΠ»ΠΈ Π²Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ Ρ‚Π°ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° эта функция, Ρ‚ΠΎ Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅Π³ΠΎ Π½ΠΈ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ, Π½ΠΈ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚: reverse = foldl (flip (:)) [].

ПозТС ΠΌΡ‹ Π½Π°ΡƒΡ‡ΠΈΠΌΡΡ ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ‚ΠΎΠΌ стилС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ продСмонстрирован Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Π΅Ρ‰Π΅ нСсколько ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ списками:

  • β€’ take — строит список ΠΈΠ· Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ количСства ΠΏΠ΅Ρ€Π²Ρ‹Ρ… элСмСнтов списка-Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. НапримСр, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ выраТСния take 4 [3,1,6,5,81 Π±ΡƒΠ΄Π΅Ρ‚ список [3,1,6,5]. Если Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ноль ΠΈΠ»ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получится пустой список. Если ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ большС, Ρ‡Π΅ΠΌ Π΄Π»ΠΈΠ½Π° Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ вСсь исходный список;
  • β€’ drop — ΠΈΠΌΠ΅Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ — количСство Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Ρ…

элСмСнтов списка ΠΈ ΡΠ°ΠΌ исходный список, Π½ΠΎ, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, отбрасываСт ΠΏΠ΅Ρ€Π²Ρ‹Π΅ элСмСнты, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ вычислСния drop 4 [3,1,6, 5, 8 ].

получится список ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта [ 5 ]. Ѐункция drop Ρ‚Π°ΠΊΠΆΠ΅ допускаСт Π·Π°Π΄Π°Π½ΠΈΠ΅ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… чисСл ΠΈ Ρ‡ΠΈΡΠ΅Π», значСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… большС, Ρ‡Π΅ΠΌ Π΄Π»ΠΈΠ½Π° Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, drop n list ΠΏΡ€ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΈΠ»ΠΈ Π½ΡƒΠ»Π΅Π²ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ ΠΏ Π²Ρ‹Π΄Π°Π΅Ρ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ list Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π° ΠΏΡ€ΠΈ n > length list Π²Ρ‹Π΄Π°Π΅Ρ‚ пустой список;

β€’ splitAt — прСдставляСт собой ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ take ΠΈ drop, выдавая сразу ΠΈ ΠΏΡ€Π΅Ρ„икс, ΠΈ ΠΏΠΎΡΡ‚фикс Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ списка Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° ΠΈΠ· Π΄Π²ΡƒΡ… списков. НапримСр, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ выраТСния splitAt 4 [3,1, 6,5,8] Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ°Ρ€Π° ([3,1,6,5], [8]). Π’ΠΎΠΎΠ±Ρ‰Π΅, Π²ΠΎ Π²ΡΠ΅Ρ… случаях выраТСния splitAt.

n list ΠΈ (take n list, drop n list) ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ ΡΠΈΠ½Ρ‚Π°ΠΊΡΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄Π΅ΠΌ Π² Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ списков. Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ списков позволяСт ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ списки ΠΈΠ· ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄Ρ€ΡƒΠ³ΠΈΡ… списков, выполняя Π½Π°Π΄ исходными элСмСнтами Ρ‚Π΅ ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Выглядит эта конструкция Ρ‚Π°ΠΊ:

[ |, ].

Π³Π΄Π΅ — конструкции для пороТдСния элСмСнтов исходных списков, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Π²ΠΈΠ΄ <-, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ… <- [ 1.. 5]; — выраТСния Π½Π°Π΄ элСмСнтами ΠΎΠ±Ρ€Π°Π·Ρ†Π°, Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‰ΠΈΠ΅ логичСскиС условия Π½Π°Π΄ элСмСнтами ΠΎΠ±Ρ€Π°Π·Ρ†Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅, Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот элСмСнт для построСния Π½ΠΎΠ²ΠΎΠ³ΠΎ списка. НапримСр, Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ списка.

[ Ρ…*Ρ… | Ρ… <- [1.100], Ρ… 'mod' 3 /= 0, Ρ… 'mod' 5 /= 0].

Π·Π°Π΄Π°Π΅Ρ‚ список ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² чисСл ΠΈΠ· ΠΏΠ΅Ρ€Π²ΠΎΠΉ сотни, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π΄Π΅Π»ΡΡ‚ся Π½ΠΈ ΠΏΠ° 3,.

Π½ΠΈ Π½Π° 5.

Если источников нСсколько, Ρ‚ΠΎ Π΄Π»Ρ построСния списка бСрутся всС ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ элСмСнтов ΠΈΠ· Π²ΡΠ΅Ρ… источников. НапримСр, ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ список всСх Π΄Π²ΡƒΡ…Π±ΡƒΠΊΠ²Π΅Π½Π½Ρ‹Ρ… слов Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ Π°Π»Ρ„Π°Π²ΠΈΡ‚Π΅ alfa ΠΌΠΎΠΆΠ½ΠΎ, записав ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ:

[ [Π°, Πͺ] | Π° <- alfa, b <- alfa ].

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

" let alfa = «abc» .

>> [ [a, b] | Π° <- alfa, b <- alfa ].

[" aa" ," ab" ," ac" ," ba" ," bb" ," be"," ca"," cb" ," cc" ].

А Π²ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ список строк, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… всС Π΄Π²ΡƒΠ·Π½Π°Ρ‡Π½Ρ‹Π΅ Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½Ρ‹Π΅ числа Π² ΠΏΠΎΡ€ΡΠ΄ΠΊΠ΅ возрастания:

" let digits = «123 456 789ΠΉ

>> [ [dl, d2] | dl <- digits, d2 <- digits, dl /=.

[" 10″ ," 11″ ," 12″ ," 13″ ," 14″ ," 15″ ," 16″ ,…," 97″ ," 98″ ,.

ii.

'O'.

99″ ].

].

(Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ прСдставлСн Π² ΡΠΎΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠΈ).

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ основного ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° Π³Π»Π°Π²Ρ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ Π·Π°Π΄Π°Ρ‡Ρƒ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ списков. Π’ Π½Π΅ΠΉ рассматриваСтся Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТная структура Π΄Π°Π½Π½Ρ‹Ρ… — список строк, Ρ‚. Π΅. список, элСмСнтами ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ слуТат списки символов. ΠŸΡƒΡΡ‚ΡŒ трСбуСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π»ΠΈ Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ спискС строк «Π±Π΅Π»Ρ‹Π΅» строки. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ «Π±Π΅Π»ΠΎΠΉ» строку, которая совсСм Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ символов Π»ΠΈΠ±ΠΎ содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ пустыС символы, Ρ‚. Π΅. символы ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ² строк ΠΈ Ρ‚. ΠΏ. Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΎΠ³ΠΎ, являСтся Π»ΠΈ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ символ пустым, Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Haskell isSpace, которая описана Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Data.Char. Для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π² Haskell ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ import, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² Π½Π°Ρ‡Π°Π»ΠΎ тСкста нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ сначала ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, являСтся Π»ΠΈ строка «Π±Π΅Π»ΠΎΠΉ». Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ простая функция, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π»Π΅Π³ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСкурсии. ПослС этого основная Π·Π°Π΄Π°Ρ‡Π° Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΡƒΠΆΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ просто: Π½ΡƒΠΆΠ½ΠΎ лишь ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ всС строки, провСряя «Ρ†Π²Π΅Ρ‚» ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ…. Если Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π° «Π±Π΅Π»Π°Ρ» строка, Ρ‚ΠΎ Ρ„ункция Ρ‚ΡƒΡ‚ ΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ True. Если Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ «Π±Π΅Π»ΠΎΠΉ» строки Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ся, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ False. Π’ Π»ΠΈΡΡ‚ΠΈΠ½Π³Π΅ 2.14 прСдставлСно ΠΏΠΎΠ»Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ.

Листинг 2.14. Ѐункция ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ наличия Π² ΡΠΏΠΈΡΠΊΠ΅ «Π±Π΅Π»Ρ‹Ρ…» строк.

import Data.Char.

— Ρ„ункция опрСдСлСния «Ρ†Π²Π΅Ρ‚Π°» строки.

white white [].

white (x:s) | isSpace x.

| otherwise.

:: String -> Bool = True = white s = False.

— Ρ„ункция, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‰Π°Ρ, ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π»ΠΈ Π² ΡΠΏΠΈΡΠΊΠ΅ строк «Π±Π΅Π»Ρ‹Π΅» hasWhites:: [String] -> Bool.

hasWhites [] = False.

hasWhites (x:s) | white x = True.

| otherwise = hasWhites s.

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ записано ΠΎΡ‡Π΅Π½ΡŒ просто ΠΈ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятно. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ стиля программирования ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎ, ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ, сколько Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ.

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ