ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

ΠŸΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² списках

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

Если потрСбуСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСсколько ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΉ элСмСнтов списка, находящихся Π½Π° Π±Π»ΠΈΠ·ΠΊΠΈΡ… позициях, Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, ΡΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ Π΅Π΅ Π½Π° Π½ΡƒΠΆΠ½ΠΎΠ΅ количСство элСмСнтов ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ элСмСнты, дСлая лишь нСбольшиС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ сдвиги. НапримСр, Ссли Ρƒ Π½Π°Ρ имСлся исходный список, ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ элСмСнт с ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠΌ 2 ΡƒΠ΄Π²ΠΎΠΈΡ‚ΡŒ, Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚ с ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠΌ 7 ΡƒΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

ΠŸΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² списках (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ. ΠŸΡƒΡΡ‚ΡŒ трСбуСтся Π² ΡΠΏΠΈΡΠΊΠ΅ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ элСмСнта с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. РазумССтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π΅Ρ‚ понятия присваивания, «Π·Π°ΠΌΠ΅Π½Π°» фактичСски ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ список, ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΎΡ‚ ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ элСмСнтС. Π—Π°Π΄Π°Ρ‡Ρƒ Π»Π΅Π³ΠΊΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ способами, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ функция Π²ΠΏΠΎΠ»Π½Π΅ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эту Π·Π°Π΄Π°Ρ‡Ρƒ: change:: Int -> Π° -> [Π°] -> [Π°] change index value list = pre ++ (value: post) where (pre, elem: post) = splitAt index list.

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

Битуация становится Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ Ρ…ΡƒΠΆΠ΅, Ссли трСбуСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСсколько Π·Π°ΠΌΠ΅Π½ Π² Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΎΠΉ области Π΄Π»ΠΈΠ½Π½ΠΎΠ³ΠΎ списка. ΠžΠ±ΠΎΠ±Ρ‰ΠΈΠΌ ΠΏΠΎΡΡ‚Π°Π²Π»Π΅Π½Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ списка ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ нСкоторая функция, ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ интСрфСйс Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ change ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π²Π²Π΅Π΄Π΅ΠΌ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ modify, которая вмСсто ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ ΠΈΠ· ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ прСобразования Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Ρ†Π΅Π»Ρ‹ΠΉ список Ρ‚Π°ΠΊΠΈΡ… ΠΏΠ°Ρ€. ΠŸΠ°Ρ€Ρƒ ΠΈΠ· ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ прСобразования значСния Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ, ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Modifier: type Modifier, Π° = (Int, Π° -> Π°).

change:: Modifier, Π° -> [Π°] -> [Π°].

change (index, f) list = pre ++ (f elem: post) where (pre, elemipost) = splitAt index list.

modify:: [Modifier a] -> [a] -> [a].

modify [] list = list.

modify ((n, f) :modifiers) list = modify modifiers $ change (n, f) list.

Π—Π΄Π΅ΡΡŒ функция modify описана ΠΊΠ°ΠΊ рСкурсивная функция, Π½ΠΎ Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ ΠΊΠ°ΠΊ свСртку списка ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ для свСртки Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ change с ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ мСстами Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ: modify modifiers list = foldl (flip change) list modifiers.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСсколько ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΡΠ΅Ρ€Π΅Π΄ΠΈΠ½Π΅ списка. НапримСр, Ссли ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ список [0.. 9] ΠΈ Ρ…ΠΎΡ‚ΠΈΠΌ Π΅Π³ΠΎ пятый элСмСнт ΡƒΠ΄Π²ΠΎΠΈΡ‚ΡŒ, Π° ΡˆΠ΅ΡΡ‚ΠΎΠΉ — ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π½Π° 2, Ρ‚ΠΎ Π΄ΠΎΡΡ‚Π°Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

" modify [(5, (*2)), (6, (+2))] [0.9].

[0,1,2,3,4,10,8,7,8,9].

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

Π‘ΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ с ΡΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡƒΡ‚ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ графичСски, Ссли ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ элСмСнты списка Π² Π²ΠΈΠ΄Π΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ², ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ элСмСнта списка ΠΈ ΡΡΡ‹Π»ΠΊΡƒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт Π² ΡΠΏΠΈΡΠΊΠ΅. НапримСр, список ΠΈΠ· ΠΏΡΡ‚ΠΈ элСмСнтов [3,5,8,2,41 ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° Ρ€ΠΈΡ. 6.1.

ГрафичСскоС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ списка.

Рис. 6.1. ГрафичСскоС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ списка.

Если ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ элСмСнта списка, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈ просмотрС ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡ… Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ спискС. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΈ этом ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π° Ρ€ΠΈΡ. 6.2.

Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΏΡ€ΠΈ поискС элСмСнта списка.

Рис. 6.2. Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΏΡ€ΠΈ поискС элСмСнта списка

ΠŸΠ°Ρ€Ρƒ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… ΠΈ ΡΠΏΠΈΡΠΊΠ° Π½Π΅ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… элСмСнтов Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠ΅ΠΉ Π² ΡΠΏΠΈΡΠΊΠ΅. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ Position: type Position, Π° = ([Π°], [Π°]).

ΠŸΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π²ΠΈΠ³Π°Ρ‚ΡŒ ΠΏΠΎ ΡΠΏΠΈΡΠΊΡƒ Π²ΠΏΡ€Π°Π²ΠΎ ΠΈΠ»ΠΈ Π²Π»Π΅Π²ΠΎ. Для этого опишСм Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: stepLeft ΠΈ stepRight, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, получая Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, Π²Ρ‹Π΄Π°ΡŽΡ‚ ΡΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡƒΡŽ Π²Π»Π΅Π²ΠΎ ΠΈΠ»ΠΈ Π²ΠΏΡ€Π°Π²ΠΎ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ: stepLeft, stepRight:: Position, Π° -> Position, Π° stepLeft ((x:path), list) = (path, x: list) stepRight (path, (x:list)) = (x:path, list).

Если Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ опСрациями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π΄Π°ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΈ, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ список элСмСнтов, продвигая ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ списка, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ ΠΏΠΎ ΡΠΏΠΈΡΠΊΡƒ. Ѐункция start Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ списку, Π° Ρ„ункция extract — ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ³Π°Ρ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π² Π½Π°Ρ‡Π°Π»ΠΎ списка ΠΈ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉΡΡ список:

start: [Π°] -> Position Π°.

start list = ([], list) extract:: Position a -> [a].

extract (path, list) = foldl (flip (:)) list path.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ change Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠ»Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ элСмСнта Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, Π° Π½Π΅ ΠΏΡ‹Ρ‚Π°Π»Π°ΡΡŒ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ список, начиная с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта. Π”Π°Π΄ΠΈΠΌ этому Π½ΠΎΠ²ΠΎΠΌΡƒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ change ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ replace:

replace:: (Π° -> Π°) -> Position, Π° -> Position, Π° replace f (path, e: list) = (path, f e: list).

Если потрСбуСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСсколько ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΉ элСмСнтов списка, находящихся Π½Π° Π±Π»ΠΈΠ·ΠΊΠΈΡ… позициях, Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, ΡΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ Π΅Π΅ Π½Π° Π½ΡƒΠΆΠ½ΠΎΠ΅ количСство элСмСнтов ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ элСмСнты, дСлая лишь нСбольшиС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ сдвиги. НапримСр, Ссли Ρƒ Π½Π°Ρ имСлся исходный список [ 0.. 9 ], ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ элСмСнт с ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠΌ 2 ΡƒΠ΄Π²ΠΎΠΈΡ‚ΡŒ, Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚ с ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠΌ 7 ΡƒΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий: ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, Π΄Π²Π° Ρ€Π°Π·Π° ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ сдвиг Π²ΠΏΡ€Π°Π²ΠΎ, ΡƒΠ΄Π²ΠΎΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ элСмСнт, ΡΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π΅Ρ‰Π΅ Π½Π° ΠΏΡΡ‚ΡŒ элСмСнтов Π²ΠΏΡ€Π°Π²ΠΎ, ΡƒΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ элСмСнт ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Π² Π½Π°Ρ‡Π°Π»ΠΎ ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉΡΡ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ список. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ сдвиги Π²ΠΏΡ€Π°Π²ΠΎ ΠΈ Π²Π»Π΅Π²ΠΎ нСсколько Ρ€Π°Π· подряд, опишСм Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ step, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ сдвиг ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ число элСмСнтов. Если это число ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ сдвиг Π²ΠΏΡ€Π°Π²ΠΎ, Π° Π΅ΡΠ»ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ — Π²Π»Π΅Π²ΠΎ: step:: Int -> Position, Π° -> Position, Π° step n pos = foldl (flip ($)) pos actions.

where action = if n >= 0 then stepRight else stepLeft actions = replicate (abs n) action Вся ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий ΠΏΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡŽ элСмСнтов списка Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ описана ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ: extract $ replace (*3) $ step 5 $ replace (*2) $ step 2.

$ start [0.9].

Π§ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий справа Π½Π°Π»Π΅Π²ΠΎ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, поэтому ΠΌΡ‹ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ($) Π½Π° Ρ‚Π°ΠΊΡƒΡŽ ΠΆΠ΅ ΠΏΠΎ ΡΠΌΡ‹ΡΠ»Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, Π½ΠΎ Ρ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ:

($>):: Π° -> (Π° -> b) -> b.

Ρ… $> f = f Ρ… Π’Π΅ΠΏΠ΅Ρ€ΡŒ запись Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ выраТСния ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ наглядной: start [0.9] $> step 2 $> replace (*2) $>

step 5 $> replace (*3) $> extract.

Если Π·Π°Π΄Π°Ρ‚ΡŒ это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ GHC, Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π΅Π³ΠΎ вычислСния получится ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ список [0,1,4,3,4,5, 6,21,8, 9].

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

Наша новая функция modify Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π‘Π½Π°Ρ‡Π°Π»Π° список Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ индСксов Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΠΌ Π² ΡΠΏΠΈΡΠΎΠΊ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½ сдвигов. Π‘ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сдвига — это сдвиг ΠΏΠΎ ΡΠΏΠΈΡΠΊΡƒ Π²ΠΏΡ€Π°Π²ΠΎ, Π° ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ — сдвиг ΠΏΠΎ ΡΠΏΠΈΡΠΊΡƒ Π²Π»Π΅Π²ΠΎ Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ число элСмСнтов. Π”Π°Π»Π΅Π΅ ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΈ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ сдвиги Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ число элСмСнтов с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ΅ΠΉΡΡ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. НаконСц, ΠΈΠ·Π²Π»Π΅Ρ‡Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉΡΡ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ список ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ extract.

ΠŸΡ€Π΅Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ списка ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² с Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΌΠΈ значСниями индСксов Π² ΡΠΏΠΈΡΠΎΠΊ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² со Π·Π½Π°Ρ‡Π΅Π½ΠΈΡΠΌΠΈ сдвигов Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ функция convert:

convert:: [Modifier Π°] -> [Modifier Π°] convert acts = zip (diffs indices) actions where (indices, actions) = unzip acts diffs [] = [].

diffs list@(x:e) = xizipWith (-) e list Π‘Π΄Π²ΠΈΠ³Π°ΠΌΠΈ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ с ΠΌΠΎΠ΄ΠΈΡ„икациями Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ элСмСнта Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ функция modifyPos:

modifyPos:: [Modifier Π°] -> Position, Π° -> Position, Π° modifyPos actions list = foldl act list actions where act mList (n, action) =.

mList $> step n $> replace action НаконСц, Π½ΠΎΠ²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ modify ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ свой ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²ΠΈΠ΄.

modify:: [Modifier Π°] -> [Π°] -> [Π°].

modify actions list = list $> start $>

modifyPos (convert actions) $> extract ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ этот Π½ΠΎΠ²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

" modify [(2, (*2)), (7, (*3))] [0.9].

[0,1,4,3,4,5,6,21,8,9].

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

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