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

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

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

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (++) <$> getLine <*> getLine ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ IO String. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ являСтся ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ дСйствиСм Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΊΠ°ΠΊ ΠΈ любоС Π΄Ρ€ΡƒΠ³ΠΎΠ΅, Ρ‚ΠΎΠΆΠ΅ возвращая Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ дСйствиям Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π²Π΅Ρ‰ΠΈ:

main = do

   a <– (++) <$> getLine <*> getLine

   putStrLn $ "Π”Π²Π΅ строки, соСдинённыС вмСстС: " ++ a

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ²

Π•Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΈΠΌ экзСмпляром класса Applicative являСтся Ρ‚ΠΈΠΏ (–>) r, ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠœΡ‹ нСчасто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½ΠΎΠΌ стилС, Π½ΠΎ концСпция, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ интСрСсна, поэтому Π΄Π°Π²Π°ΠΉΡ‚Π΅ взглянСм, ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ экзСмпляр Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ[12].

instance Applicative ((–>) r) where

   pure x = (\_ –> x)

   f <*> g = \x –> f x (g x)

Когда ΠΌΡ‹ ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pure, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ этим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ контСкст ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² качСствС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ экзСмпляра функция pure ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ создаёт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ Π΅ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈ всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pure для экзСмпляра Ρ‚ΠΈΠΏΠ° (–>) r выглядит ΠΊΠ°ΠΊ pure :: a –> (r –> a).

ghci> (pure 3) "ля"

3

Из-Π·Π° каррирования ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ лСвоассоциативно, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ скобки:

ghci> pure 3 "ля"

3

РСализация экзСмпляра <*> Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°Π³Π°Π΄ΠΎΡ‡Π½Π°, поэтому Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ² Π² Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½ΠΎΠΌ стилС:

ghci> :t (+) <$> (+3) <*> (*100)

(+) <$> (+3) <*> (*100) :: (Num a) => a –> a

ghci> (+) <$> (+3) <*> (*100) $ 5

508

Π’Ρ‹Π·ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° <*> с двумя Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ значСниями Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, поэтому Ссли ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π΅Π³ΠΎ с двумя функциями, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π§Ρ‚ΠΎ ΠΆΠ΅ здСсь происходит? Когда ΠΌΡ‹ выполняСм (+) <$> (+3) <*> (*100), ΠΌΡ‹ создаём Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ + ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (+3) ΠΈ (*100) ΠΈ Π²Π΅Ρ€Π½Ρ‘Ρ‚ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ выраТСния (+) <$> (+3) <*> (*100) $ 5 Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (+3) ΠΈ (*100) сначала ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ 5, Ρ‡Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π΄Π°Ρ‘Ρ‚ 8 ΠΈ 500; Π·Π°Ρ‚Π΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ + вызываСтся со значСниями 8 ΠΈ 500, Ρ‡Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π΄Π°Ρ‘Ρ‚ 508.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½:

ghci> (\x y z –> [x,y,z]) <$> (+3) <*> (*2) <*> (/2) $ 5

[8.0,10.0,2.5]

ΠœΡ‹ создаём Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ \x y z –> [x, y, z] с ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ выполнСния, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Ρ‘Π½Π½Ρ‹ΠΌΠΈ функциями (+3), (*2) ΠΈ (/2). Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 5 пСрСдаётся ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Ρ‚Ρ€Ρ‘Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π° Π·Π°Ρ‚Π΅ΠΌ с этими Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ вызываСтся анонимная функция \x y z –> [x, y, z].

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. НС Ρ‚Π°ΠΊ ΡƒΠΆ Π²Π°ΠΆΠ½ΠΎ, поняли Π»ΠΈ Π²Ρ‹, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ экзСмпляр Ρ‚ΠΈΠΏΠ° (–>) r для класса Applicative, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΎΡ‚Ρ‡Π°ΠΈΠ²Π°ΠΉΡ‚Π΅ΡΡŒ, Ссли Π²Π°ΠΌ это ΠΏΠΎΠΊΠ° Π½Π΅ ясно. ΠŸΠΎΡ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ с Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ стилСм ΠΈ функциями, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдставлСниС ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ².

ЗастёгиваСмыС списки

ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ способы для списков Π±Ρ‹Ρ‚ΡŒ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ. Один способ ΠΌΡ‹ ΡƒΠΆΠ΅ рассмотрСли: Π²Ρ‹Π·ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° <*> со списком Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ списком Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ· Π»Π΅Π²ΠΎΠ³ΠΎ списка ΠΊ значСниям Π² спискС справа.

НапримСр, Ссли ΠΌΡ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ [(+3),(*2)] <*> [1,2], Ρ‚ΠΎ функция (+3) Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° ΠΈ ΠΊ 1, ΠΈ ΠΊ 2; функция (*2) Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° ΠΈ ΠΊ 1, ΠΈ ΠΊ 2, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ станСт список ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Ρ‘Ρ… элСмСнтов: [4,5,2,4]. Однако [(+3),(*2)] <*> [1,2] ΠΌΠΎΠ³Π»Π° Π±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ пСрвая функция Π² спискС слСва Π±Ρ‹Π»Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π² спискС справа, вторая Π±Ρ‹Π»Π° Π±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΈ Ρ‚. Π΄. Π­Ρ‚ΠΎ Π²Π΅Ρ€Π½ΡƒΠ»ΠΎ Π±Ρ‹ список с двумя значСниями: [4,4]. Π’Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΊΠ°ΠΊ [1 + 3, 2 * 2].

ЭкзСмпляром класса Applicative, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΡ‹ Π΅Ρ‰Ρ‘ Π½Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Π»ΠΈΡΡŒ, являСтся Ρ‚ΠΈΠΏ ZipList, ΠΈ находится ΠΎΠ½ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Control.Applicative.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΈΠΏ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π²Π° экзСмпляра для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ класса Ρ‚ΠΈΠΏΠΎΠ², Π±Ρ‹Π» Π²Π²Π΅Π΄Ρ‘Π½ Ρ‚ΠΈΠΏ ZipList a, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ имССтся ΠΎΠ΄ΠΈΠ½ конструктор (ZipList) с СдинствСнным ΠΏΠΎΠ»Π΅ΠΌ (список). Π’ΠΎΡ‚ Ρ‚Π°ΠΊ опрСдСляСтся Π΅Π³ΠΎ экзСмпляр:

instance Applicative ZipList where

   pure x = ZipList (repeat x)

   ZipList fs <*> ZipList xs = ZipList (zipWith (\f x –> f x) fs xs)

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ <*> примСняСт ΠΏΠ΅Ρ€Π²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ – ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, ΠΈ Ρ‚. Π΄. Π­Ρ‚ΠΎ дСлаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ выраТСния zipWith (\f x –> f x) fs xs. Π’Π²ΠΈΠ΄Ρƒ особСнностСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ zipWith ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ список Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΠΉ ΠΆΠ΅ Π΄Π»ΠΈΠ½Ρ‹, Ρ‡Ρ‚ΠΎ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ список ΠΈΠ· Π΄Π²ΡƒΡ….

Ѐункция pure здСсь Ρ‚Π°ΠΊΠΆΠ΅ интСрСсна. Она Π±Π΅Ρ€Ρ‘Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² список, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ просто повторяСтся бСсконСчно. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ pure "Ρ…Π°-Ρ…Π°" Π²Π΅Ρ€Π½Ρ‘Ρ‚ ZipList (["Ρ…Π°-Ρ…Π°","Ρ…Π°-Ρ…Π°","Ρ…Π°-Ρ…Π°"… Π­Ρ‚ΠΎ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ ΡΠ±ΠΈΡ‚ΡŒ с Ρ‚ΠΎΠ»ΠΊΡƒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ функция pure Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ контСкст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. И Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ бСсконСчный список Ρ‡Π΅Π³ΠΎ-Π»ΠΈΠ±ΠΎ Π΅Π΄Π²Π° Π»ΠΈ являСтся ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ. Но это ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΏΡ€ΠΈ использовании застёгиваСмых списков, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ удовлСтворяСт Π·Π°ΠΊΠΎΠ½Ρƒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ pure f <*> xs Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ эквивалСнтно Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ fmap f xs. Если Π±Ρ‹ Π²Ρ‹Π·ΠΎΠ² выраТСния pure 3 просто Π²Π΅Ρ€Π½ΡƒΠ» ZipList [3], Π²Ρ‹Π·ΠΎΠ² pure (*2) <*> ZipList [1,5,10] Π΄Π°Π» Π±Ρ‹ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ZipList [2], ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΄Π»ΠΈΠ½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ списка ΠΈΠ· Π΄Π²ΡƒΡ… застёгнутых списков Ρ€Π°Π²Π½Π° Π΄Π»ΠΈΠ½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ³ΠΎ списка ΠΈΠ· Π΄Π²ΡƒΡ…. Если ΠΌΡ‹ застСгнём ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ список с бСсконСчным, Π΄Π»ΠΈΠ½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ списка всСгда Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½Π° Π΄Π»ΠΈΠ½Π΅ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ списка.

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΆΠ΅ застёгиваСмыС списки Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½ΠΎΠΌ стилС? Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим.

Π›Π°Π΄Π½ΠΎ, Ρ‚ΠΈΠΏ ZipList a Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ экзСмпляра класса Show, поэтому ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getZipList для извлСчСния ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ списка ΠΈΠ· застёгиваСмого:

ghci> getZipList $ (+) <$> ZipList [1,2,3] <*> ZipList [100,100,100]

[101,102,103]

ghci> getZipList $ (+) <$> ZipList [1,2,3] <*> ZipList [100,100..]

[101,102,103]

ghci> getZipList $ max <$> ZipList [1,2,3,4,5,3] <*> ZipList [5,3,1,2]

[5,3,3,4]

ghci> getZipList $ (,,) <$> ZipList "ΠΏΠ°Ρ€" <*> ZipList "Ρ‚ΠΎΠΊ" <*> ZipList "Π²ΠΈΠ΄"

[('ΠΏ','Ρ‚','Π²'),('Π°','ΠΎ','ΠΈ'),('Ρ€',ΠΊt','Π΄')]

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. Ѐункция (,,) – это Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ анонимная функция \x y z –> (x,y,z). Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, функция (,) – Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ \x y –> (x,y).

Помимо Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ zipWith Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠ°ΠΊ zipWith3, zipWith4, Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ 7. Ѐункция zipWith Π±Π΅Ρ€Ρ‘Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΈ застёгиваСт с Π΅Ρ‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π²Π° списка. Ѐункция zipWith3 Π±Π΅Ρ€Ρ‘Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΈ застёгиваСт с Π΅Ρ‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Ρ€ΠΈ списка, ΠΈ Ρ‚. Π΄. ΠŸΡ€ΠΈ использовании застёгиваСмых списков Π² Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½ΠΎΠΌ стилС Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ застёгивания для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ числа списков, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°ΡΡ‚Π΅Π³Π½ΡƒΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ. ΠœΡ‹ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ для застёгивания ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ количСства списков ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ это ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ.

АппликативныС Π·Π°ΠΊΠΎΠ½Ρ‹

Как ΠΈ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ², ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π°ΠΌ дСйствуСт нСсколько Π·Π°ΠΊΠΎΠ½ΠΎΠ². Π‘Π°ΠΌΡ‹ΠΉ Π³Π»Π°Π²Π½Ρ‹ΠΉ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΎΡΡŒ тоТдСство pure f <*> x = fmap f x. Π’ качСствС упраТнСния ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этого Π·Π°ΠΊΠΎΠ½Π° для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΈΠ· этой Π³Π»Π°Π²Ρ‹. НиТС пСрСчислСны Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Π·Π°ΠΊΠΎΠ½Ρ‹:

β€’ pure id <*> v = v

β€’ pure (.) <*> u <*> v <*> w = u <*> (v <*> w)

β€’ pure f <*> pure x = pure (f x)

β€’ u <*> pure y = pure ($ y) <*> u

ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это заняло Π±Ρ‹ ΠΌΠ½ΠΎΠ³ΠΎ страниц ΠΈ Π±Ρ‹Π»ΠΎ Π±Ρ‹ нСсколько скучно. Если Π²Π°ΠΌ интСрСсно, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с этими Π·Π°ΠΊΠΎΠ½Π°ΠΌΠΈ ΠΏΠΎΠ±Π»ΠΈΠΆΠ΅ ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π»ΠΈ ΠΎΠ½ΠΈ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… экзСмпляров.

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

ΠœΠΎΠ΄ΡƒΠ»ΡŒ Control.Applicative опрСдСляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая называСтся liftA2 ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ: