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

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

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

liftA2 :: (Applicative f) => (a –> b –> c) –> f a –> f b –> f c

Она ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

liftA2 :: (Applicative f) => (a –> b –> c) –> f a –> f b –> f c

liftA2 f a b = f <$> a <*> b

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

ΠŸΡ€ΠΈ использовании ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ просто ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠŸΡ€ΠΈ использовании Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ нСсколькими значСниями Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ². Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π²ΠΈΠ΄Π΅ (a –> b –> c) –> (f a –> f b –> f c). Когда ΠΌΡ‹ Π΅Π³ΠΎ воспринимаСм ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ функция liftA2 Π±Π΅Ρ€Ρ‘Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Π±ΠΈΠ½Π°Ρ€Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π΅Ρ‘ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с двумя Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ значСниями.

Π•ΡΡ‚ΡŒ интСрСсная концСпция: ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Π·ΡΡ‚ΡŒ Π΄Π²Π° Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… значСния ΠΈ свСсти ΠΈΡ… Π² ΠΎΠ΄Π½ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ содСрТит Π² сСбС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ этих Π΄Π²ΡƒΡ… Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² спискС. НапримСр, Ρƒ нас Π΅ΡΡ‚ΡŒ значСния Just 3 ΠΈ Just 4. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ содСрТит одноэлСмСнтный список, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ этого ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ:

ghci> fmap (\x –> [x]) (Just 4)

Just [4]

Π₯ΠΎΡ€ΠΎΡˆΠΎ, скаТСм, Ρƒ нас Π΅ΡΡ‚ΡŒ значСния Just 3 ΠΈ Just [4]. Как Π½Π°ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Just [3,4]? Π­Ρ‚ΠΎ просто!

ghci> liftA2 (:) (Just 3) (Just [4])

Just [3,4]

ghci> (:) <$> Just 3 <*> Just [4]

Just [3,4]

ВспомнитС, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ : – это функция, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ элСмСнт ΠΈ список ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ список с этим элСмСнтом Π² Π½Π°Ρ‡Π°Π»Π΅. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Just [3,4], ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π»ΠΈ ΠΌΡ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ это со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Just 2, Ρ‡Ρ‚ΠΎΠ±Ρ‹ произвСсти Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Just [2,3,4]? Π”Π°, ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹. ΠŸΠΎΡ…ΠΎΠΆΠ΅, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ любоС количСство Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² ΠΎΠ΄Π½ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ содСрТит список Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² этих Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ содСрТит список Π² качСствС своСго Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ значСния. Назовём Π΅Ρ‘ sequenceA:

sequenceA :: (Applicative f) => [f a] –> f [a]

sequenceA [] = pure []

sequenceA (x:xs) = (:) <$> x <*> sequenceA xs

А-Π°-Π°, рСкурсия! ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго смотрим Π½Π° Ρ‚ΠΈΠΏ. Он трансформируСт список Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ со списком. ПослС этого ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Π»ΠΎΠΆΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ основу для Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ случая. Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ пустой список Π² Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ со списком Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², Ρ‚ΠΎ просто ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ пустой список Π² контСкст ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² Π΄Π΅Π»ΠΎ вступаСт рСкурсия. Если Ρƒ нас Π΅ΡΡ‚ΡŒ список с Β«Π³ΠΎΠ»ΠΎΠ²ΠΎΠΉΒ» ΠΈ «хвостом» (вспомнитС, x – это Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° xs – это список, состоящий ΠΈΠ· Π½ΠΈΡ…), ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sequenceA с «хвостом», Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ со списком Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π³ΠΎ. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ просто прСдваряСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, содСрТащимся Π²Π½ΡƒΡ‚Ρ€ΠΈ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ значСния x, список, находящийся Π²Π½ΡƒΡ‚Ρ€ΠΈ этого Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ значСния, – Π²ΠΎΡ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ!

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΌΡ‹ выполняСм:

sequenceA [Just 1, Just 2]

По ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ такая запись эквивалСнтна ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ:

(:) <$> Just 1 <*> sequenceA [Just 2]

Разбивая это Π΄Π°Π»Π΅Π΅, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ:

(:) <$> Just 1 <*> ((:) <$> Just 2 <*> sequenceA [])

ΠœΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² выраТСния sequenceA [] оканчиваСтся Π² Π²ΠΈΠ΄Π΅ Just [], поэтому Π΄Π°Π½Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

(:) <$> Just 1 <*> ((:) <$> Just 2 <*> Just [])

Ρ‡Ρ‚ΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ этому:

(:) <$> Just 1 <*> Just [2]

…что Ρ€Π°Π²Π½ΠΎ Just [1,2]!

Π”Ρ€ΡƒΠ³ΠΎΠΉ способ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sequenceA – использованиС свёртки. ВспомнитС, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ любая функция, Π³Π΄Π΅ ΠΌΡ‹ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ списку элСмСнт Π·Π° элСмСнтом ΠΈ ΠΏΠΎΠΏΡƒΡ‚Π½ΠΎ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ свёртки:

sequenceA :: (Applicative f) => [f a] –> f [a]

sequenceA = foldr (liftA2 (:)) (pure [])

ΠœΡ‹ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ список с ΠΊΠΎΠ½Ρ†Π°, начиная со значСния аккумулятора Ρ€Π°Π²Π½ΠΎΠ³ΠΎ pure []. ΠœΡ‹ примСняСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ liftA2 (:) ΠΌΠ΅ΠΆΠ΄Ρƒ аккумулятором ΠΈ послСдним элСмСнтом списка, Ρ‡Ρ‚ΠΎ Π΄Π°Ρ‘Ρ‚ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, содСрТащСС одноэлСмСнтный список. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ liftA2 (:) с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ послСдним элСмСнтом ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ аккумулятором ΠΈ Ρ‚. Π΄., Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€ ΠΏΠΎΠΊΠ° Ρƒ нас Π½Π΅ останСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ аккумулятор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит список Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² всСх Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊ ΠΊΠ°ΠΊΠΈΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ значСниям:

ghci> sequenceA [Just 3, Just 2, Just 1]

Just [3,2,1]

ghci> sequenceA [Just 3, Nothing, Just 1]

Nothing

ghci> sequenceA [(+3),(+2),(+1)] 3

[6,5,4]

ghci> sequenceA [[1,2,3],[4,5,6]]

[[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]]

ghci> sequenceA [[1,2,3],[4,5,6],[3,4,4],[]]

[]

ΠŸΡ€ΠΈ использовании со значСниями Ρ‚ΠΈΠΏΠ° Maybe функция sequenceA создаёт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Maybe, содСрТащСС всС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² Π²ΠΈΠ΄Π΅ списка. Если ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ€Π°Π²Π½ΠΎ Nothing, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ‚ΠΎΠΆΠ΅ являСтся Nothing. Π­Ρ‚ΠΎ просто расчудСсно, ΠΊΠΎΠ³Π΄Π° Ρƒ вас Π΅ΡΡ‚ΡŒ список Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° Maybe ΠΈ Π²Ρ‹ заинтСрСсованы Π² значСниях, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π½ΠΈΡ… Π½Π΅ Ρ€Π°Π²Π½ΠΎ Nothing!

Π’ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΊ функциям sequenceA ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создали Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая приняла число Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ»Π° Π΅Π³ΠΎ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² спискС, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Π΅Ρ€Π½ΡƒΠ»Π° список Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². Ѐункция sequenceA [(+3),(+2),(+1)] 3 Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (+3) с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ 3, (+2) – с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ 3 ΠΈ (+1) – с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ 3 ΠΈ Π²Π΅Ρ€Π½Ρ‘Ρ‚ всС эти Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² Π²ΠΈΠ΄Π΅ списка.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ выраТСния (+) <$> (+3) <*> (*2) создаст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ Π΅Π³ΠΎ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (+3) ΠΈ (*2), Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ + с этими двумя Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ. БоотвСтствСнно, Π΅ΡΡ‚ΡŒ смысл Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ sequenceA [(+3),(*2)] создаёт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ Π΅Π³ΠΎ всСм функциям Π² спискС. ВмСсто Π²Ρ‹Π·ΠΎΠ²Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° + с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ сочСтаниС : ΠΈ pure [] для накоплСния этих Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π² список, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ИспользованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sequenceA ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ список Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΠΌ всСм ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π²Π²ΠΎΠ΄, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ список Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². НапримСр, Ρƒ нас Π΅ΡΡ‚ΡŒ число ΠΈ Π½Π°ΠΌ интСрСсно, удовлСтворяСт Π»ΠΈ ΠΎΠ½ΠΎ всСм ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°ΠΌ Π² спискС. Π’ΠΎΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ:

ghci> map (\f –> f 7) [(>4),(<10),odd]

[True,True,True]

ghci> and $ map (\f –> f 7) [(>4),(<10),odd]

True

ВспомнитС, Ρ‡Ρ‚ΠΎ функция and ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° Bool ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True, Ссли всС ΠΎΠ½ΠΈ Ρ€Π°Π²Π½Ρ‹ True. Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ способ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° – ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sequenceA:

ghci> sequenceA [(>4),(<10),odd] 7

[True,True,True]

ghci> and $ sequenceA [(>4),(<10),odd] 7

True

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ sequenceA [(>4),(<10),odd] создаёт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ число, пСрСдаст Π΅Π³ΠΎ всСм ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°ΠΌ Π² спискС [(>4),(<10),odd] ΠΈ Π²Π΅Ρ€Π½Ρ‘Ρ‚ список Π±ΡƒΠ»Π΅Π²Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Она ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список с Ρ‚ΠΈΠΏΠΎΠΌ (Num a) => [a –> Bool] Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с Ρ‚ΠΈΠΏΠΎΠΌ (Num a) => a –> [Bool]. ΠŸΡ€Π°Π²Π΄Π°, ΠΊΠ»Ρ‘Π²ΠΎ, Π°?

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ списки ΠΎΠ΄Π½ΠΎΡ€ΠΎΠ΄Π½Ρ‹, всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² спискС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅. Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список Π²Ρ€ΠΎΠ΄Π΅ [ord, (+3)], ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ функция ord ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ символ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ функция (+3) ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ число ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число.

ΠŸΡ€ΠΈ использовании со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ [] функция sequenceA ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список списков ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список списков. На самом Π΄Π΅Π»Π΅ ΠΎΠ½Π° создаёт списки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат всС ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ находящихся Π² Π½ΠΈΡ… элСмСнтов. ΠŸΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ это ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sequenceA, Π° Π·Π°Ρ‚Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° списков:

ghci> sequenceA [[1,2,3],[4,5,6]]

[[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]]

ghci> [[x,y] | x <– [1,2,3], y <– [4,5,6]]

[[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]]

ghci> sequenceA [[1,2],[3,4]]

[[1,3],[1,4],[2,3],[2,4]]

ghci> [[x,y] | x <– [1,2], y <– [3,4]]

[[1,3],[1,4],[2,3],[2,4]]

ghci> sequenceA [[1,2],[3,4],[5,6]]

[[1,3,5],[1,3,6],[1,4,5],[1,4,6],[2,3,5],[2,3,6],[2,4,5],[2,4,6]]

ghci> [[x,y,z] | x <– [1,2], y <– [3,4], z <– [5,6]]

[[1,3,5],[1,3,6],[1,4,5],[1,4,6],[2,3,5],[2,3,6],[2,4,5],[2,4,6]]

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (+) <$> [1,2] <*> [4,5,6] Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ вычислСниС x + y, Π³Π΄Π΅ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† x ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· [1,2], Π° y ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· [4,5,6]. ΠœΡ‹ прСдставляСм это Π² Π²ΠΈΠ΄Π΅ списка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ выполняСм Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ sequenceA [[1,2],[3,4],[5,6]], Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ являСтся Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ вычислСниС [x,y,z], Π³Π΄Π΅ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† x ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· [1,2], Π° y – ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· [3,4] ΠΈ Ρ‚. Π΄. Для прСдставлСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° этого Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ вычислСния ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ список, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π² спискС являСтся ΠΎΠ΄Π½ΠΈΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ списком. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ являСтся список списков.