Π”ΠΈΠΏΠ»ΠΎΠΌΡ‹, курсовыС, Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚Ρ‹, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅...
Брочная ΠΏΠΎΠΌΠΎΡ‰ΡŒ Π² ΡƒΡ‡Ρ‘Π±Π΅

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠΈΡ… порядков

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

ВСрнСмся ΠΊ Ρ„ункциям Π²Ρ‹ΡΡˆΠΈΡ… порядков. Ѐункция Ρ‚Π°Ρ€ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ΅Ρ‚ Π΅Π΅ ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°ΠΌ списка, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ получаСтся Π½ΠΎΠ²Ρ‹ΠΉ список. МоТно Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка, которая Π±ΡƒΠ΄Π΅Ρ‚ «ΡΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ» список, вырабатывая Π½Π° Π±Π°Π·Π΅ всСх элСмСнтов списка ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Вакая функция для соСдинСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… элСмСнтов списка Π² ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠΈΡ… порядков (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ изучСния ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° Π³Π»Π°Π²Ρ‹ 3 студСнт Π΄ΠΎΠ»ΠΆΠ΅Π½:

Π·Π½Π°Ρ‚ΡŒ

  • β€’ понятия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка, ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…;
  • β€’ понятия лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² Ρ„ункциях Π²Ρ‹ΡΡˆΠΈΡ… порядков;
  • β€’ Ρ‚ΠΎ, Π² ΠΊΠ°ΠΊΠΈΡ… случаях ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ СстСствСнный ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ;

ΡƒΠΌΠ΅Ρ‚ΡŒ

  • β€’ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ стандартными функциями Π²Ρ‹ΡΡˆΠΈΡ… порядков для массовой ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…;
  • β€’ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ стандартныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ списков для получСния ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… ΠΈ ΠΏΠΎΠ½ΡΡ‚Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ;

Π²Π»Π°Π΄Π΅Ρ‚ΡŒ

  • β€’ Π½Π°Π²Ρ‹ΠΊΠ°ΠΌΠΈ примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Ρ‹ΡΡˆΠΈΡ… порядков Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ Haskell;
  • β€’ Π½Π°Π²Ρ‹ΠΊΠ°ΠΌΠΈ избавлСния ΠΎΡ‚ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠΈ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ слоТных структур Π΄Π°Π½Π½Ρ‹Ρ….

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠ²Π΅Ρ€Ρ‚ΠΊΠ°. Лямбда-выраТСния

Π’ ΡΡ‚ΠΎΠΌ ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅ ΠΌΡ‹ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ способы описания ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΈΠ»ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… языках программирования Ρ‚Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ часто Π±Ρ‹Π²Π°Π΅Ρ‚ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ значСниями «ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса», Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ описания Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹, Π½ΠΎ ΠΈ ΡΠ²Π»ΡΡŽΡ‚ся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½Ρ‹Ρ… срСдств построСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π’ ΡΠ·Ρ‹ΠΊΠ΅ имССтся большоС количСство стандартных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. Из Ρ…ΠΎΡ€ΠΎΡˆΠΎ извСстных ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π½Π°Π·ΠΎΠ²Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая, получая Π΄Π²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π²Ρ‹Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ… ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ.

ΠœΡ‹, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π½Π°Ρ‡Π½Π΅ΠΌ Π½Π΅ Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ супСрпозиции, Π° Ρ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ рассмотрим ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ списков Ρ‚Π°Ρ€, которая, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² список ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ прСобразования элСмСнтов этого списка, Π²Ρ‹Π΄Π°Π΅Ρ‚ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° список ΠΈΠ· ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… элСмСнтов, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту списка. Если, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, функция sqr Π²ΠΎΠ·Π²ΠΎΠ΄ΠΈΡ‚ свой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚, Ρ‚ΠΎ Ρ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°Ρ€ ΠΌΠΎΠΆΠ½ΠΎ, имСя список Ρ†Π΅Π»Ρ‹Ρ… чисСл, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список ΠΈΡ… ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ²: map sqr [1, 2, 5, -2] -" [1, 4, 25, 4].

Ѐункция Ρ‚Π°Ρ€ — это стандартная функция, опрСдСлСнная Π² ΡΠ΄Ρ€Π΅ языка. Однако ΠΏΠΎ ΡƒΠΆΠ΅ слоТившСйся Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Π΅Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°Π½ΠΎΠ²ΠΎ. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Π΅Π΅ Ρ‚ΠΈΠΏ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ являСтся функция, которая здСсь ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Ρ†Π΅Π»Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ†Π΅Π»Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π’ΠΈΠΏ этого ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ (Integer -> Integer). Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ — это списки Ρ†Π΅Π»Ρ‹Ρ… Ρ‚ΠΈΠΏΠ° [Integer]. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ map: (Integer -> Integer) -> [Integer] -> [Integer].

Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ Π²Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ исходный ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ списки содСрТат ΠΈΠΌΠ΅Π½Π½ΠΎ элСмСнты Ρ‚ΠΈΠΏΠ° Integer. ЀактичСски исходныС элСмСнты ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π°. Π’ΠΎΠ³Π΄Π°, Ссли функция, ΡΠ²Π»ΡΡŽΡ‰Π°ΡΡΡ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°Ρ€, ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ (Π° -> Π¬), Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ список Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ элСмСнты Ρ‚ΠΈΠΏΠ° Π¬. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ‚Π°Ρ€, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΈ Π΅Π΅ Ρ‚ΠΈΠΏ (листинг 3.1).

Листинг 3.1. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ отобраТСния списков — ΡˆΠ°Ρ€

Ρ‚Π°Ρ€:: (Π° -> Π¬) -> [Π°] -> [Π¬].

— Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ примСнСния Ρ‚Π°Ρ€ ΠΊ ΠΏΡƒΡΡ‚ΠΎΠΌΡƒ списку — пустой список Ρ‚Π°Ρ€ _ [] = [].

Ρ‚Π°Ρ€ func (x:s) = (func Ρ…): (Ρ‚Π°Ρ€ func s).

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

Ѐункция, подобная Ρ‚Π°Ρ€, которая Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ Π²Ρ‹Π΄Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, называСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка, ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΠΎΠΌ.

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

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

ΠŸΡƒΡΡ‚ΡŒ трСбуСтся ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ список всСх простых сомноТитСлСй Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ большого списка Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½Ρ‹Ρ… чисСл. МоТно для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΈΠΌΠ΅ΡŽΡ‰ΡƒΡŽ ΠΎΠ΄ΠΈΠ½ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ — упорядочСнный список ΡƒΠΆΠ΅ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… простых сомноТитСлСй. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, напишСм ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‰ΡƒΡŽ наимСньший простой ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒ Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ числа, большСго Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹. Для простоты Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ сильно Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΠ± ΡΡ„фСктивности этой послСднСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. НапримСр, функция ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ написана ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. minFactor n = minFactor' ΠΏ 2.

where minFactor' n d I n 'mod4 d == 0 = d.

I otherwise = minFactor' n (d+1).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ функция ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ списка Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½Ρ‹Ρ… чисСл ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ (ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ — исходный список, Π²Ρ‚ΠΎΡ€ΠΎΠΉ — Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ список простых сомноТитСлСй): factorList [] factors = factors.

factorList (l:xs) factors = factorList xs factors factorList (x:xs) factors =.

factorList ((x 'div4 d):xs) (insert d factors) where d = minFactor x.

insert d [] = [d].

insert d factors® (f: fs) | d < f = d: factors.

| d == f = factors | otherwise = f: insert d fs.

На ΠΏΡ€ΠΎΡΡ‚Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ функция Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. НапримСр, написав Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ factorList [12, 24, 36, 25] [ ], ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ [2,3,5]. Наша функция ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ элСмСнты исходного списка, получая, Π½ΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ простыС сомноТитСли ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ числа. Однако ΠΌΠΎΠΆΠ½ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Ссли Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ простыС сомноТитСли ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта списка ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ элСмСнтами. Π­Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°Ρ€.

ΠŸΠ΅Ρ€Π΅ΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. НапишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½ΠΎΠΌΡƒ числу ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ упорядочСнный список Π΅Π³ΠΎ простых сомноТитСлСй, ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ Π΅Π΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎ Π²ΡΠ΅ΠΌ элСмСнтам списка. ПослС этого всС списки ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π² ΠΎΠ΄ΠΈΠ½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ слияния упорядочСнных списков.

ΠŸΠΎΠ»Π½Ρ‹ΠΉ тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ коммСнтариями содСрТится Π² Π»ΠΈΡΡ‚ΠΈΠ½Π³Π΅ 3.2.

Листинг 3.2. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° вычислСния списка простых сомноТитСлСй списка чисСл.

  • — Π€ΡƒΠ½ΠΊΡ†ΠΈΡ factors Π²Ρ‹Π΄Π°Π΅Ρ‚ упорядочСнный список простых
  • — ΡΠΎΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»Π΅ΠΉ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ числа

factors: Integer -> [Integer].

factors n = reverse $ factors' n 2 [] where

— Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ функция factors' ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… — Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° — ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ провСряСмый Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ d ΠΈ — ΡƒΠΆΠ΅ вычислСнный список простых сомноТитСлСй, ΠΌΠ΅Π½ΡŒΡˆΠΈΡ… d.

factors' 1 _ list = factors' n d list.

list.

| d * d > n = add n list.

| n 'mod' d == 0 = factors' (n 'div' d) d (add d list).

| otherwise = factors' n (d+1) list — Ѐункция add добавляСт ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ ΡΠΎΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒ Π² Π½Π°Ρ‡Π°Π»ΠΎ — списка, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ список оказываСтся — ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹ΠΌ, add d [ ] = [d].

add d listQ (xixs) | d == x = list.

| otherwise = d: list.

  • — Π€ΡƒΠ½ΠΊΡ†ΠΈΡ merge сливаСт Π±Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ Π΄Π²Π° упорядочСнных
  • — ΡΠΏΠΈΡΠΊΠ° Ρ†Π΅Π»Ρ‹Ρ… Π² ΠΎΠ΄ΠΈΠ½

merge:: Ord, Π° => [Π°] -> [Π°] -> [Π°].

merge [] list = list.

merge list [] = list.

merge listl®(xl:xsl) list20(x2:xs2).

| xl < x2 = xl: merge xsl list2 | xl == x2 = xl: merge xsl xs2 | otherwise = x2: merge listl xs2.

— Π€ΡƒΠ½ΠΊΡ†ΠΈΡ mergeLists сливаСт Π±Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ список — упорядочСнных списков Π² ΠΎΠ΄ΠΈΠ½ список. mergeLists:: Ord, Π° => [ [Π°] ] -> [Π°].

mergeLists [] = [].

mergeLists (list:lists) = merge list $ mergeLists lists.

— ΠžΡΠ½ΠΎΠ²Π½Π°Ρ функция для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ получСния списка всСх — простых Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΉ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ списка Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½Ρ‹Ρ… чисСл. factorList: [Integer] -> [Integer] factorList list = mergeLists $ map factors list.

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

Π’ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌ случаС, ΠΊΠΎΠ³Π΄Π° функция ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ уравнСния, лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ Π²ΠΈΠ΄, ΠΊΠ°ΠΊ ΠΈ ΡΡ‚ΠΎ СдинствСнноС ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅. Π Π°Π·Π½ΠΈΡ†Π° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Π»Π΅Π²ΠΎΠΉ Π΅Π³ΠΎ части вмСсто ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ стоит символ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ косой Ρ‡Π΅Ρ€Ρ‚Ρ‹ (ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠΉ Π³Ρ€Π΅Ρ‡Π΅ΡΠΊΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ «Π»ΡΠΌΠ±Π΄Π°» — А,), Π° Π²ΠΌΠ΅ΡΡ‚ΠΎ Π·Π½Π°ΠΊΠ° равСнства для отдСлСния ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠ² для Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΎΡ‚ ΠΏΡ€Π°Π²ΠΎΠΉ части уравнСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ символов ' ->1. НапримСр, Ссли функция sqr для возвСдСния числа Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ нСпосрСдствСнно Ρ‚Π°ΠΌ, Π³Π΄Π΅ эта функция ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.

Π’ΠΎΠ³Π΄Π° Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡˆΠ°Ρ€ для получСния списка ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ², упомянутый Π² Π½Π°Ρ‡Π°Π»Π΅ Π³Π»Π°Π²Ρ‹, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: Ρ‚Π°Ρ€ (Ρ… -> Ρ… * Ρ…) [1, 2, 5, -2].

Если ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ нСсколько, Ρ‚ΠΎ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π² ΠΎΠ΄Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ условного выраТСния if Π»ΠΈΠ±ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ конструкции для Π²Ρ‹Π±ΠΎΡ€Π° ΠΏΠΎ ΠΎΠ±Ρ€Π°Π·Ρ†Π°ΠΌ — case. НапримСр, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список ΠΈΠ· Π·Π½Π°ΠΊΠΎΠ² Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ списка Ρ†Π΅Π»Ρ‹Ρ… чисСл с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°Ρ€ (Π·Π½Π°ΠΊ числа — это функция, Π²Ρ‹Π΄Π°ΡŽΡ‰Π°Ρ ноль, Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ ΠΈΠ»ΠΈ минус Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, являСтся Π»ΠΈ число Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ, ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠ»ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ), ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ способами. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для вычислСния Π·Π½Π°ΠΊΠ° числа, скаТСм, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

signum 0=0.

signum n | n < 0 = -1.

| otherwise = 1.

Π’ΠΎΠ³Π΄Π° Π²Ρ‹Π·ΠΎΠ² для нахоТдСния списка Π·Π½Π°ΠΊΠΎΠ² Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ списка чисСл выглядСл Π±Ρ‹ ΠΊΠ°ΠΊ map signum [2,5,0,-3,2,-2].

(Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получится список [1, 1, 0, -1, 1, -1]).

Π’Ρ‚ΠΎΡ€ΠΎΠΉ способ Π²Ρ‹Π·ΠΎΠ²Π°, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ функция вычислСния Π·Π½Π°ΠΊΠ° числа опрСдСляСтся прямо Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ Π²Ρ‹Π·ΠΎΠ²Π°, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ (вмСсто Ρ‚Ρ€Π΅Ρ… ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ использовано условноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅):

map (-> if ΠΏ == 0 then 0 else if n < 0 then -1 else 1).

[2,5/0,-3,2,-2].

НаконСц, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ конструкции case Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: map (-> case n of

0 -> 0.

ΠΏ | ΠΏ -1.

| otherwise -> 1) [2,5,0,-3,2,-2].

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ case позволяСт произвСсти Π²Ρ‹Π±ΠΎΡ€ срСди Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠ² Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ это происходит ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Ρ€ΠΎΠ»ΡŒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈΠ³Ρ€Π°Π΅Ρ‚ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, стоящСС нСпосрСдствСнно послС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова case. ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΠ³Π»ΡƒΠ±Π»ΡΡ‚ΡŒΡΡ Π² Ρ‚онкости синтаксиса для всСстороннСго изучСния конструкции case, Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π½Π°ΠΌ Π² Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅ΠΌ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ся. Однако Π·Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ всСгда ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ лямбда-выраТСния, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΡ€Π°Π²Ρ‹Ρ… частях ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ся имя самой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Π°ΠΊ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΡˆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ signum Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ являСтся лишь Π΄Ρ€ΡƒΠ³ΠΎΠΉ синтаксичСской Ρ„ΠΎΡ€ΠΌΠΎΠΉ для опрСдСлСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ лямбда-выраТСния: signum = -> case n of

0 -> 0.

ΠΏ | ΠΏ -1 | otherwise -> 1.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ Ρ„ΠΎΡ€ΠΌΡƒ записи, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ имСнованная функция опрСдСляСтся Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ локально с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ лямбда-выраТСния ΠΈ Π±Π»ΠΎΠΊΠ° where. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строчкС Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Ρ‹ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 10.

Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½Ρ‹Ρ… чисСл:

map factorial [1.10] where

factorial = -> if n == 0 then 1 else n * factorial (n-1).

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ здСсь Π² Π»ΡΠΌΠ±Π΄Π°-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ использован рСкурсивный Π²Ρ‹Π·ΠΎΠ². Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ where с Π½ΠΈΠΌ связываСтся имя.

Π‘Π»ΠΎΠΊ where ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΌΡ‹ ΡƒΠΆΠ΅ использовали Ρ‚Π°ΠΊΡƒΡŽ запись Π² Π»ΠΈΡΡ‚ΠΈΠ½Π³Π΅ 3.2, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ каТдая ΠΈΠ· ΡΡ‚ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΎ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ, ΠΈ Π΄Π°ΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, локальноС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сдСлано Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠ΅: map factorial [1.10] where

factorial:: Integer -> Integer factorial 0=1.

factorial n | n > 0 = n * factorial (n-1).

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

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

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

Листинг 3.3. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ свСртки списков — f oldl ΠΈ f oldr

foldl:: (b -> a -> b) -> b -> [a] -> b.

foldl _ seed [] = seed.

foldl f seed (x:s) = foldl f (f seed x) s.

foldr:: (a -> b -> b) -> b -> [a] -> b.

foldr _ seed [] = seed.

foldr f seed (x:s) = f x (foldr f seed s).

Рассмотрим уравнСния, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ (ограничимся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ foldr, уравнСния для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ foldl Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹). Как ΠΈ Π² ΡΠ»ΡƒΡ‡Π°Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°Ρ€, ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ опрСдСляСт ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ свСртки для случая, ΠΊΠΎΠ³Π΄Π° исходный список пуст. Как ΠΌΡ‹ ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ, Π² ΡΡ‚ΠΎΠΌ случаС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, опрСдСляСмоС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ seed. Если ΠΆΠ΅ исходный список Π½Π΅ ΠΏΡƒΡΡ‚, Ρ‚ΠΎ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго, построим свСртку хвоста списка с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСкурсивного обращСния ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ foldr, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ Π½Π°ΡˆΡƒ Π±ΠΈΠ½Π°Ρ€Π½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ f ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ элСмСнту списка ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ свСртки хвоста. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получится искомый Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Иногда Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ свСртки Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ вставки, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ вставкС Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, которая задаСтся Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΌΠ΅ΠΆΠ΄Ρƒ элСмСнтами списка.

Π‘ΡƒΠΌΠΌΡƒ всСх элСмСнтов Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ списка list Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ простым Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ любой ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ foldl ΠΈΠ»ΠΈ foldr ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния выбираСтся ноль, Π° Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ бСрСтся опСрация слоТСния: foldl (+) 0 list.

ΠΎΠ΄Π½Π°ΠΊΠΎ функция свСртки — это довольно мощная функция, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π² ΡΠ°ΠΌΡ‹Ρ… Ρ€Π°Π·Π½Ρ‹Ρ…, ΠΏΠΎΡ€ΠΎΠΉ довольно Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Ρ… ситуациях. НапримСр, Ссли ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ присоСдинСния элСмСнта ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ списка Π² Π²ΠΈΠ΄Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ addElem addElem list elem = elemrlist.

(Π·Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ эта опСрация отличаСтся ΠΎΡ‚ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΠΎΠ³ΠΎ конструктора списков (:) Ρ‚ΠΎΠ»ΡŒΠΊΠΎ порядком Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²), Ρ‚ΠΎ Ρ„ункция «ΠΏΠ΅Ρ€Π΅Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΡ» списка, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΎΠΏΠΈΡΡ‹Π²Π°Π»ΠΈ Π² Π³Π». 1 Π² Π²ΠΈΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reverse, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ foldl: reverse list = foldl addElem [] list.

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

factorial n = foldr (*) 1 [l.n].

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°Ρ€ свСртка списка производится ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ значСния ΠΎΠ±ΠΎΠΈΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Ссли Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния бСрСтся ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠ² списка, Ρ‚ΠΎ Π² ΡΠ»ΡƒΡ‡Π°Π΅ ассоциативной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ свСртку ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… участков списка нСзависимо ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Π’ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Haskell наряду с Ρ„ункциями foldl ΠΈ f oldr ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ foldll ΠΈ foldrl, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния, Π° Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния Π±Π΅Ρ€ΡƒΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ»ΠΈ, соотвСтствСнно, послСдний элСмСнты самого списка. РазумССтся, эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ ΠΊ ΠΏΡƒΡΡ‚ΠΎΠΌΡƒ списку. Если бинарная опСрация, примСняСмая для свСртки, ассоциативна, Ρ‚ΠΎ ΡΡ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ участки списка ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΎΠ²Ρ‹ΡˆΠ°Ρ Ρ‚Π΅ΠΌ самым ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π² ΡΠ»ΡƒΡ‡Π°Π΅ многопроцСссорных систСм.

К ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡŽ, Π°ΡΡΠΎΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ — это свойство, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ аналитичСски. НапримСр, суммированиС элСмСнтов нСпустого списка [3, 7, 2, 4, 10] ΠΌΠΎΠΆΠ½ΠΎ провСсти с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ выраТСния foldll (+) [3, 7, 2, 4, 10].

Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ получится Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 26, Π° Ρ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠΎΡ…ΠΎΠΆΠ΅Π³ΠΎ выраТСния.

foldll (-) [3, 7, 2, 4, 10].

получится Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 3 — 7 — 2 — 4 — 10 = -20. Но Π΅ΡΠ»ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, примСняя слоТСниС Π² Π»ΡŽΠ±ΠΎΠΌ порядкС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, (3 + 7) + (2 + 4) + 10, ΠΈ, Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ списка ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ провСсти ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ, Ρ‚ΠΎ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ΅ построСниС (3−7) — (2−4) — 10 даст совсСм Π½Π΅ Ρ‚ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая для ассоциативной Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ f Π΄Π°ΡΡ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈ ΡΠ²Π΅Ρ€Ρ‚ΠΊΠΈ foldll ΠΈ foldrl, Π½ΠΎ ΠΏΡ‹Ρ‚аСтся Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π½Π° Π΄Π²ΡƒΡ… участках списка. Подобная функция даст Π½Π°ΠΌ прСимущСство ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ свСрткой Π² ΡΠ»ΡƒΡ‡Π°Π΅ ΠΎΡ‡Π΅Π½ΡŒ «Ρ‚яТСлой» Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Π½Ρ‹Ρ… систСмах:

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

fold2 _ [Ρ…] = Ρ….

fold2 f [Ρ…, Ρƒ] = f Ρ… Ρƒ.

fold2 f (xl:x2:xs) = f (f xl x2) (fold2 f xs).

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π°ΡˆΡƒ Π½ΠΎΠ²ΡƒΡŽ свСртку ΠΊ ΡΠΏΠΈΡΠΊΡƒ [3, 7, 2, 4,

10], ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ слоТСния Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: fold2 (+) [3, 7, 2, 4, 10]:

" fold2 (+) [3, 7, 2, 4, 10].

ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡƒΠ΄Π°Ρ‡Π½Π°, Π½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π΄ΡƒΠΊΡ†ΠΈΠΉ, которая получаСтся Π² ΡΠ»ΡƒΡ‡Π°Π΅ примСнСния ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ свСртки foldll ΠΈ Π½Π°ΡˆΠ΅ΠΉ свСртки fold2. ΠžΠ±Ρ‹Ρ‡Π½Π°Ρ свСртка Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ:

foldll (+) [3, 7, 2, 4, 10].

  • 3 + foldll (+) [ 7, 2, 4, 10]
  • 3 + (7 + foldll (+) [2, 4, 10])
  • 3 + (7 + (2 + foldll (+) [4, 10]))
  • 3 + (7 + (2 + (4 + foldll (+) [10])))
  • 3 + (7 + (2 + (4 + 10)))
  • 3 + (7 + (2 + 14))
  • 3 + (7 + 16)
  • 3 + 23 26

ВсС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ€Π°ΡΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΡ‚ΡŒ вычислСния Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ возмоТности. Π’Π΅ΠΏΠ΅Ρ€ΡŒ посмотрим, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ fold2:

fold2 (+) [3, 7, 2, 4, 10].

  • (3 + 7) + f old2 (+) [ 2, 4, 10]
  • (3 + 7) + ((2 + 4) + fold2 (+) [10])
  • (3 + 7) + ((2 + 4) + 10)
  • 10 + (6 + 10)
  • 10 + 16 26

НСкоторая экономия достигнута — ΠΌΡ‹ ΡΠΌΠΎΠ³Π»ΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ «ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ» суммы (3 + 7) ΠΈ (2 + 4). Однако Π½Π° ΡΡ‚ΠΎΠΌ наш ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ заканчиваСтся. Ѐункция fold2 позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ ΠΏΠ°Ρ€Π°ΠΌΠΈ элСмСнтов, Π½ΠΎ Π² Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° всС Ρ€Π°Π²Π½ΠΎ происходит строго ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. МоТно Π»ΠΈ «Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ» ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ дальшС?

Рассмотрим Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ Π²Π΅Ρ€ΡΠΈΡŽ свСртки — Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ f old3:

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

fold3 _ [Ρ…] = Ρ….

fold3 f [Ρ…, Ρƒ] = f Ρ… Ρƒ.

fold3 f list = f (fold3 f first) (fold3 f second) where (first, second) = splitAt (length list 'div' 2) list.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ эффСкт ΠΎΡ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°, продСмонстрируСм Ρ€Π°Π±ΠΎΡ‚Ρƒ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ° Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΠ½Π½ΠΎΠΌ спискС ΠΈΠ· Π²ΠΎΡΡŒΠΌΠΈ элСмСнтов. ΠŸΡ€ΠΈ этом Π±ΡƒΠ΄Π΅ΠΌ «ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ» Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ Ρ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ этапС ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ для вычислСния: fold3 (+) [1, 2, 3, 4, 5, 6, 7, 8].

fold3 (+) [1, 2, 3, 4] + fold3 (+) [5, 6, 7, 8].

  • (fold3 (+) [1, 2] + fold3 (+) [3, 4]) +
  • (f old3 (+) [5, 6] + f old3 (+) [7, 8])
  • ((1 + 2) + (3 + 4)) + ((5 + 6) + (7 + 8))
  • (3 + 7) + (11 + 15)
  • 10 + 26 36

Π’Π΅ΠΏΠ΅Ρ€ΡŒ с ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠΎΠΌ всС Π² ΠΏΠΎΡ€ΡΠ΄ΠΊΠ΅, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ функция splitAt для ΠΎΡ‡Π΅Π½ΡŒ Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… списков Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ нСэффСктивно. ВмСсто Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ ΠΏΠΎ Π΄Π»ΠΈΠ½Π΅ списка Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½ΡƒΡŽ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ splitAt Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π΅ Π·Π° ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΠΎΠ΅ врСмя, ΠΎΠ½Π° Π΅Ρ‰Π΅ ΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹Π΅ списки Π²ΠΎ Π²Ρ€Π΅ΠΌΡ своСй Ρ€Π°Π±ΠΎΡ‚Ρ‹, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΌΡƒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΉ памяти Ρ‚ΠΎΠΆΠ΅ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ высока. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, всС эти нСдостатки ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²Π΅ΡˆΠ΅Π½Ρ‹ Π²Ρ‹Π³ΠΎΠ΄ΠΎΠΉ ΠΎΡ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°, Ссли Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ наша опСрация «ΡΠ»ΠΎΠΆΠ΅Π½ΠΈΡ» элСмСнтов сущСствСнно Π±ΠΎΠ»Π΅Π΅ слоТная, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ смысл Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΅Π΅ Π² ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΌ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ΅.

ПозТС, Π² Π³Π». 8 ΠΌΡ‹ Π²Π΅Ρ€Π½Π΅ΠΌΡΡ ΠΊ Π²ΠΎΠΏΡ€ΠΎΡΡƒ ΠΎ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ΅ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ свСртки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ассоциативной Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠΈΡ… порядков, Π²Ρ‹Π΄Π°ΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΄Ρ€ΡƒΠ³ΠΈΡ…. НавСрноС, ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ°ΠΌΡ‹Ρ… распространСнных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ функциями являСтся ΠΈΡ… ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ·ΠΈΡ†ΠΈΡ (ΠΈΠ»ΠΈ композиция). Вакая опСрация позволяСт ΠΏΠΎ Π΄Π²ΡƒΠΌ функциям fug ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ f g Ρ‚Π°ΠΊΡƒΡŽ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ f g Ρ… Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π΅ΠΌ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ f ΠΈ g: f (Π΄ Ρ…). Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… языков программирования, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² ΡΠ·Ρ‹ΠΊΠ΅ Haskell Ρ‚Π°ΠΊΠΎΠ΅ описаниС Π½Π΅ ΡΠΎΡΡ‚авляСт Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ‚Ρ€ΡƒΠ΄Π°:

comp:: (b -> Π°) -> (с -> Π¬) -> (с -> Π°) comp f g = Ρ… -> f (g x).

Вакая функция имССтся Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ языка Haskell Π² Π²ΠΈΠ΄Π΅ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (.) β€’ Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли имССтся функция возвСдСния числового значСния Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ sqr, Ρ‚ΠΎ Ρ„ункция возвСдСния числа Π² Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΡƒΡŽ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ power4 ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π°.

power4 = sqr. sqr.

Π’ Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅ΠΌ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ довольно часто.

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

flip:: (Π° -> b -> с) -> (Π¬ -> Π° -> с) flip func = Ρ… Ρƒ -> func Ρƒ Ρ… Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ обращСния списка ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ явного описания Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ addElem: reverse list = foldl (flip (:)) [] list.

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

Вспомним Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ сортировки списка ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ простых вставок, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΡƒΡŽ Π² Π»ΠΈΡΡ‚ΠΈΠ½Π³Π΅ 2.16. Π’ ΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ — simpleSort ΠΈ insert. ΠŸΠ΅Ρ€Π²Π°Ρ рСкурсивная функция осущСствляла сортировку списка с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ вставки элСмСнтов Π² ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡Π΅Π½Π½Ρ‹ΠΉ список, ΠΈ ΡΡ‚Ρƒ вставку ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Π»Π° функция insert. Π’ Ρ‚ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»ΠΈ, ΠΊΠ°ΠΊ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π±Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ эффСктивной посрСдством ΠΊΠΎΠ½Ρ†Π΅Π²ΠΎΠΉ рСкурсии ΠΈ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π’Π΅ΠΏΠ΅Ρ€ΡŒ напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ simpleSort вовсС Π±Π΅Π· рСкурсии: simpleSort list = foldl insert [] list.

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ insert ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠΈ слоТнСС, Π½ΠΎ ΠΏΠΎΠ·ΠΆΠ΅ ΠΌΡ‹ ΡΠΌΠΎΠΆΠ΅ΠΌ ΠΈ Π΅Π΅ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ простых встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

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