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

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

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

quicksort :: (Ord a) => [a] –> [a]

quicksort [] = []

quicksort (x:xs) =

  let smallerSorted = quicksort (filter (<= x) xs)

      biggerSorted = quicksort (filter (> x) xs)

  in  smallerSorted ++ [x] ++ biggerSorted

Π•Ρ‰Ρ‘ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² использования map ΠΈ filter

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°ΠΉΠ΄Ρ‘ΠΌ наибольшСС число мСньшС 100 000, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ дСлится Π½Π° число 3829 Π±Π΅Π· остатка. Для этого ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅ΠΌ мноТСство Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…, ΠΊΠ°ΠΊ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Π΅ΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

largestDivisible :: Integer

largestDivisible = head (filter p [100000,99999..])

  where p x = x `mod` 3829 == 0

Для Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ создали список всСх чисСл ΠΌΠ΅Π½ΡŒΡˆΠΈΡ… 100 000 Π² порядкС убывания. Π—Π°Ρ‚Π΅ΠΌ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Π»ΠΈ список с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ числа отсортированы Π² ΡƒΠ±Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌ порядкС, наибольшСС ΠΈΠ· Π½ΠΈΡ…, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰Π΅Π΅ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρƒ, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ элСмСнтом ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ списка. Нам Π΄Π°ΠΆΠ΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ список для нашСго Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ мноТСства. Π‘Π½ΠΎΠ²Π° «лСнь Π² дСйствии»! ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Β«Π³ΠΎΠ»ΠΎΠ²ΡƒΒ» списка, Π½Π°ΠΌ Π½Π΅Π²Π°ΠΆΠ½ΠΎ, ΠΊΠΎΠ½Π΅Ρ‡Π΅Π½ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ список ΠΈΠ»ΠΈ бСсконСчСн. ВычислСния ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ находится ΠΏΠ΅Ρ€Π²ΠΎΠ΅ подходящСС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.



Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ собираСмся Π½Π°ΠΉΡ‚ΠΈ сумму всСх Π½Π΅Ρ‡Ρ‘Ρ‚Π½Ρ‹Ρ… ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΌΠ΅Π½ΡŒΡˆΠΈΡ… 10 000. Но для Π½Π°Ρ‡Π°Π»Π° познакомимся с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ takeWhile: ΠΎΠ½Π° пригодится Π² нашСм Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ. Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ ΠΈ список, Π° Π·Π°Ρ‚Π΅ΠΌ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΎΠ±Ρ…ΠΎΠ΄ списка с Π΅Π³ΠΎ Β«Π³ΠΎΠ»ΠΎΠ²Ρ‹Β», возвращая Ρ‚Π΅ Π΅Π³ΠΎ элСмСнты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‚ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρƒ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°ΠΉΠ΄Π΅Π½ элСмСнт, Π½Π΅ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰ΠΈΠΉ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρƒ, ΠΎΠ±Ρ…ΠΎΠ΄ останавливаСтся. Если Π±Ρ‹ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ слово строки "слоны ΡƒΠΌΠ΅ΡŽΡ‚ Π²Π΅ΡΠ΅Π»ΠΈΡ‚ΡŒΡΡ", ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Π²Ρ‹Π·ΠΎΠ²: takeWhile (/=' ') "слоны ΡƒΠΌΠ΅ΡŽΡ‚ Π²Π΅ΡΠ΅Π»ΠΈΡ‚ΡŒΡΡ", ΠΈ функция Π²Π΅Ρ€Π½ΡƒΠ»Π° Π±Ρ‹ "слоны".

Π˜Ρ‚Π°ΠΊ, Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½Π°Ρ‡Π½Ρ‘ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (^2) ΠΊ бСсконСчному списку [1..]. Π—Π°Ρ‚Π΅ΠΌ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅ΠΌ список, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π½Ρ‘ΠΌ Π±Ρ‹Π»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅Ρ‡Ρ‘Ρ‚Π½Ρ‹Π΅ элСмСнты. Π”Π°Π»Π΅Π΅ Π²ΠΎΠ·ΡŒΠΌΡ‘ΠΌ ΠΈΠ· Π½Π΅Π³ΠΎ значСния, мСньшиС 10000. И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ сумму элСмСнтов этого списка. Нам Π΄Π°ΠΆΠ΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ для этого Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ – достаточно Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠΉ строки Π² GHCi:

ghci> sum (takeWhile (<10000) (filter odd (map (^2) [1..])))

166650

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

ghci> sum (takeWhile (<10000) [m | m <– [n^2 | n <– [1..]], odd m])

166650

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π·Π°Π΄Π°Ρ‡Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ с рядами ΠšΠΎΠ»Π»Π°Ρ‚Ρ†Π°. Π‘Π΅Ρ€Ρ‘ΠΌ Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½ΠΎΠ΅ число. Если это число Ρ‡Ρ‘Ρ‚Π½ΠΎΠ΅, Π΄Π΅Π»ΠΈΠΌ Π΅Π³ΠΎ Π½Π° Π΄Π²Π°. Если Π½Π΅Ρ‡Ρ‘Ρ‚Π½ΠΎΠ΅ – ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ Π΅Π³ΠΎ Π½Π° 3 ΠΈ прибавляСм Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. Π‘Π΅Ρ€Ρ‘ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ΅Π΅ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ снова повторяСм всю ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π½ΠΎΠ²ΠΎΠ΅ число, ΠΈ Ρ‚. Π΄. Π’ сущности, Ρƒ нас получаСтся Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° чисСл. Π‘ ΠΊΠ°ΠΊΠΎΠ³ΠΎ Π±Ρ‹ значСния ΠΌΡ‹ Π½ΠΈ Π½Π°Ρ‡Π°Π»ΠΈ, Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° заканчиваСтся Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅. Если Π±Ρ‹ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π±Ρ‹Π»ΠΎ 13, ΠΌΡ‹ Π±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Ρ‚Π°ΠΊΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ: 13, 40, 20, 10, 5, 16, 8, 4, 2, 1. Всё ΠΏΠΎ Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠΉ схСмС: 13 Γ— 3 + 1 равняСтся 40; 40, Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ΅ Π½Π° 2, Ρ€Π°Π²Π½ΠΎ 20, ΠΈ Ρ‚. Π΄. Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ‚ 10 элСмСнтов.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ трСбуСтся Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ: Ссли Π²Π·ΡΡ‚ΡŒ всС стартовыС числа ΠΎΡ‚ 1 Π΄ΠΎ 100, ΠΊΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ ΠΈΠΌΠ΅ΡŽΡ‚ Π΄Π»ΠΈΠ½Ρƒ большС 15? Для Π½Π°Ρ‡Π°Π»Π° напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая создаёт Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ:

chain :: Integer -> [Integer]

chain 1 = [1]

chain n

    | even n = n:chain (n `div` 2)

    | odd n  = n:chain (n*3 + 1)

Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° заканчиваСтся Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅, это Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ случай. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ»Π°ΡΡŒ довольно-Ρ‚Π°ΠΊΠΈ стандартная рСкурсивная функция.

ghci> chain 10

[10,5,16,8,4,2,1]

ghci> chain 1

[1]

ghci> chain 30

[30,15,46,23,70,35,106,53,160,80,40,20,10,5,16,8,4,2,1]

Π’Π°ΠΊ! Π’Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. Ну Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ функция, которая ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ Π½Π° наш вопрос:

numLongChains :: Int

numLongChains = length (filter isLong (map chain [1..100]))

  where isLong xs = length xs > 15

ΠœΡ‹ примСняСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ chain ΠΊ списку [1..100], Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ; Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ списками. Π—Π°Ρ‚Π΅ΠΌ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅ΠΌ ΠΈΡ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ провСряСт Π΄Π»ΠΈΠ½Ρƒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ. ПослС Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ смотрим, ΠΊΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ спискС.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. Π­Ρ‚Π° функция ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ numLongChains :: Int, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ length Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Int вмСсто экзСмпляра класса Num – Ρ‚Π°ΠΊ ΡƒΠΆ слоТилось историчСски. Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰ΠΈΠΉ Ρ‚ΠΈΠΏ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ экзСмпляр класса Num, Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ fromIntegral ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Ρ‘Π½Π½ΠΎΠΌΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ length.

Ѐункция map для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ map, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ΄Π΅Π»Ρ‹Π²Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊΠΈΠ΅ ΡˆΡ‚ΡƒΠΊΠΈ: map (*) [0..] – Ссли Π½Π΅ для ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ практичСской Ρ†Π΅Π»ΠΈ, Ρ‚ΠΎ хотя Π±Ρ‹ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°Ρ€Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (частично ΠΏΡ€ΠΈΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹Π΅) – это настоящиС значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π² списки (Π½ΠΎ нСльзя ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ строк). Π”ΠΎ сих ΠΏΠΎΡ€ ΠΌΡ‹ примСняли ΠΊ спискам Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ, Π²Ρ€ΠΎΠ΄Π΅ map (*2) [0..], Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список Ρ‚ΠΈΠΏΠ° (Num a) => [a], Π½ΠΎ с Ρ‚Π΅ΠΌ ΠΆΠ΅ успСхом ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ (*) [0..] Π±Π΅Π·ΠΎ всяких ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. ΠŸΡ€ΠΈ этом числа Π² спискС Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ *, Ρ‚ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ (Num a) => a –> a –> a. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π²ΡƒΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ * ΠΊ списку [0..], ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ список Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ (Num a) => [a –> a]. Бписок, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ map (*) [0..], Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, записав [(0*),(1*),(2*),(3*),(4*),(5*)…

ghci> let listOfFuns = map (*) [0..]

ghci> (listOfFuns !! 4) 5

20

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΈΠ· списка содСрТит Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая выполняСт ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ – (4*). Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ примСняСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 5 ΠΊ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ (4*) 5 ΠΈΠ»ΠΈ просто 4 * 5.

Лямбда-выраТСния


Лямбда-выраТСния – это Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Ссли нСкоторая функция Π½ΡƒΠΆΠ½Π° Π½Π°ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΌΡ‹ создаём Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с СдинствСнной Ρ†Π΅Π»ΡŒΡŽ: ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, пишСм символ \ (Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‰ΠΈΠΉ, Ссли Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π½ΡŒΠΊΠΎ Π½Π°ΠΏΡ€ΡΡ‡ΡŒ Π²ΠΎΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π³Ρ€Π΅Ρ‡Π΅ΡΠΊΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ лямбда – Ξ»), Π·Π°Ρ‚Π΅ΠΌ записываСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, раздСляя ΠΈΡ… ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ. Π”Π°Π»Π΅Π΅ пишСм Π·Π½Π°ΠΊ –> ΠΈ Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΡ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ лямбду Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки, ΠΈΠ½Π°Ρ‡Π΅ ΠΎΠ½Π° продолТится Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° строки Π²ΠΏΡ€Π°Π²ΠΎ.

Если Π²Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠΌΡƒ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅, Ρ‚ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ создали Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ isLong Π² сСкции where Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ numLongChains Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Ρ‘ Π² Ρ„ΠΈΠ»ΡŒΡ‚Ρ€. ВмСсто этого ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

numLongChains :: Int

numLongChains = length (filter (\xs –> length xs > 15) (map chain [1..100]))



АнонимныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ выраТСниями, поэтому ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Ρ‚Π°ΠΊΠΈΠΌ способом, ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (\xs –> length xs > 15) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Π½Π°ΠΌ, большС Π»ΠΈ 15 Π΄Π»ΠΈΠ½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ списка.

Π’Π΅, ΠΊΡ‚ΠΎ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°Ρ€Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ частичноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°ΠΌ, Π³Π΄Π΅ Π½Π΅ слСдуСт. НапримСр, выраТСния map (+3) [1,6,3,2] ΠΈ map (\x –> x + 3) [1,6,3,2] эквивалСнтны, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ (+3) ΠΈ (\x –> x + 3) – это Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ Ρ‚Ρ€ΠΎΠΉΠΊΡƒ ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ. ИзлишнС Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ использованиС Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² этом случаС Π½Π΅ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ частичноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»Π΅Π³Ρ‡Π΅ читаСтся.

Как ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, лямбда-выраТСния ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ количСство ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

ghci> zipWith (\a b –> (a * 30 + 3) / b) [5,4,3,2,1] [1,2,3,4,5]

[153.0,61.5,31.0,15.75,6.6]

По Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ функциями, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ сопоставлСниС с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ Π² лямбда-выраТСниях. ЕдинствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ нСльзя ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ нСсколько ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠ² для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° – Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΠ±Ρ€Π°Π·Ρ†Ρ‹ [] ΠΈ (x: xs) ΠΈ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘Ρ‚ ΠΊ ΠΎΠ±Ρ€Π°Π·Ρ†Ρƒ (x:xs) Π² случаС Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ с []. Если сопоставлСниС с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ Π² Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ заканчиваСтся Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ, происходит ошибка Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ поостороТнСС с этим!

ghci> map (\(a,b) –> a + b) [(1,2),(3,5),(6,3),(2,6),(2,5)]

[3,8,9,8,7]

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

addThree :: Int -> Int -> Int -> Int