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

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

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

Ѐункция return ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ контСкст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² качСствС своСго Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Ρ‚ΠΈΠΏΠ° Maybe ΠΎΠ½Π° Π½Π΅ вносит Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ нСуспСха Π² вычислСниях; для списков – Π½Π΅ вносит ΠΊΠ°ΠΊΡƒΡŽ-Π»ΠΈΠ±ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ.

Π’ΠΎΡ‚ ΠΏΡ€ΠΎΠ±Π½Ρ‹ΠΉ запуск для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΌΠΎΠ½Π°Π΄:

ghci> Just "двигайся дальшС" >>= (\x –> return x)

Just "двигайся дальшС"

ghci> [1,2,3,4] >>= (\x –> return x)

[1,2,3,4]

ghci> putStrLn "Π’Π°Ρ…!" >>= (\x –> return x)

Π’Π°Ρ…!

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ со списком рСализация ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ >>= выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

xs >>= f = concat (map f xs)

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ список [1,2,3,4] Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ return, сначала ΠΎΠ½Π° ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ [1,2,3,4], Ρ‡Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π΄Π°Ρ‘Ρ‚ список списков [[1],[2],[3],[4]]. Π—Π°Ρ‚Π΅ΠΌ это конкатСнируСтся, ΠΈ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ наш ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ список.

Π›Π΅Π²ΠΎΠ΅ тоТдСство ΠΈ ΠΏΡ€Π°Π²ΠΎΠ΅ тоТдСство ΡΠ²Π»ΡΡŽΡ‚ΡΡ, ΠΏΠΎ сути, Π·Π°ΠΊΠΎΠ½Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚, ΠΊΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ½Π° вСсти сСбя функция return. Π­Ρ‚ΠΎ ваТная функция для прСвращСния ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² монадичСскиС, ΠΈ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Ссли Π±Ρ‹ монадичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ½Π° ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π»Π°, ΠΈΠΌΠ΅Π»ΠΎ большС, Ρ‡Π΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ контСкст.

ΠΡΡΠΎΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ

ПослСдний монадичСский Π·Π°ΠΊΠΎΠ½ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ монадичСских Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ >>=, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ значСния Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Ρ‹. Π’ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ записи Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ (m >>= f) >>= g – Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ m >>= (\x –> f x >>= g).

Π“ΠΌ-ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‚ΡƒΡ‚ происходит? Π£ нас Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ монадичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, m, ΠΈ Π΄Π²Π΅ монадичСскиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, f ΠΈ g. Когда ΠΌΡ‹ выполняСм Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (m >>= f) >>= g, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ m Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ f, Ρ‡Ρ‚ΠΎ Π΄Π°Ρ‘Ρ‚ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ монадичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ это Π½ΠΎΠ²ΠΎΠ΅ монадичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ g. Π’ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ m >>= (\x –> f x >>= g) ΠΌΡ‹ Π±Π΅Ρ€Ρ‘ΠΌ монадичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ примСнСния f x Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ g. НСлСгко ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ±Π΅ эти записи Ρ€Π°Π²Π½Ρ‹, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΄Π°Π²Π°ΠΉΡ‚Π΅ взглянСм Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Π»Π°Π΅Ρ‚ это равСнство Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ.

ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅ нашСго ΠΊΠ°Π½Π°Ρ‚ΠΎΡ…ΠΎΠ΄Ρ†Π° ΠŸΡŒΠ΅Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пытался ΡƒΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ равновСсиС, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΏΡ‚ΠΈΡ†Ρ‹ ΠΏΡ€ΠΈΠ·Π΅ΠΌΠ»ΡΠ»ΠΈΡΡŒ Π½Π° Π΅Π³ΠΎ балансировочный ΡˆΠ΅ΡΡ‚? Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΈΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ·Π΅ΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΏΡ‚ΠΈΡ† Π½Π° балансировочный ΡˆΠ΅ΡΡ‚, ΠΌΡ‹ создали Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³Π»ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ вычислСний:

ghci> return (0, 0) >>= landRight 2 >>= landLeft 2 >>= landRight 2

Just (2,4)

ΠœΡ‹ Π½Π°Ρ‡Π°Π»ΠΈ со значСния Just (0, 0), Π° Π·Π°Ρ‚Π΅ΠΌ связали это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ монадичСской Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ landRight 2. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±Ρ‹Π»ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ монадичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, связанноС со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ монадичСской Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, ΠΈ Ρ‚. Π΄. Если Π±Ρ‹ Π½Π°Π΄Π»Π΅ΠΆΠ°Π»ΠΎ явно Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ это Π² скобки, ΠΌΡ‹ написали Π±Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

ghci> ((return (0, 0) >>= landRight 2) >>= landLeft 2) >>= landRight 2

Just (2,4)

Но ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

return (0, 0) >>= (\x –>

landRight 2 x >>= (\y –>

landLeft 2 y >>= (\z –>

landRight 2 z)))

Π’Ρ‹Π·ΠΎΠ² return (0, 0) – Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ Just (0, 0), ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ это Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ±Ρ€Π°Π·Π΅Ρ† x ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (0, 0). Ѐункция landRight ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ количСство ΠΏΡ‚ΠΈΡ† ΠΈ ΡˆΠ΅ΡΡ‚ (ΠΊΠΎΡ€Ρ‚Π΅ΠΆ, содСрТащий числа) – ΠΈ это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΅ΠΉ пСрСдаётся. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Just (0, 2), ΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ±Ρ€Π°Π·Π΅Ρ† y становится Ρ€Π°Π²Π΅Π½ (0, 2). Π­Ρ‚ΠΎ продолТаСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° послСднСС ΠΏΡ€ΠΈΠ·Π΅ΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΏΡ‚ΠΈΡ†Ρ‹ Π½Π΅ Π²Π΅Ρ€Π½Ρ‘Ρ‚ Π² качСствС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Just (2, 4), Ρ‡Ρ‚ΠΎ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ являСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ всСго выраТСния.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π΅Π²Π°ΠΆΠ½ΠΎ, ΠΊΠ°ΠΊ Ρƒ вас Π²Π»ΠΎΠΆΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ монадичСским функциям. Π’Π°ΠΆΠ΅Π½ ΠΈΡ… смысл. Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ способ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этого Π·Π°ΠΊΠΎΠ½Π°. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΌΡ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π΄Π²ΡƒΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, f ΠΈ g:

(.) :: (b –> c) –> (a –> b) –> (a –> c)

f . g = (\x –> f (g x))

Если функция g ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ a –> b ΠΈ функция f ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ b –> c, ΠΌΡ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΡƒΠ΅ΠΌ ΠΈΡ… Π² Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ‚ΠΈΠΏΠ° a –> c, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Ρ‘ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ пСрСдавался ΠΌΠ΅ΠΆΠ΄Ρƒ этими функциями. А Ρ‡Ρ‚ΠΎ Ссли эти Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – монадичСскиС? Π§Ρ‚ΠΎ Ссли Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ ΠΈΠΌΠΈ значСния Π±Ρ‹Π»ΠΈ Π±Ρ‹ монадичСскими? Если Π±Ρ‹ Ρƒ нас Π±Ρ‹Π»Π° функция Ρ‚ΠΈΠΏΠ° a –> m b, ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ просто ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Ρ‘ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ° b –> m c, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ эта функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ b, Π½Π΅ монадичСскоС. Π§Ρ‚ΠΎΠ±Ρ‹ всё-Ρ‚Π°ΠΊΠΈ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ нашСй Ρ†Π΅Π»ΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ <=<:

(<=<) :: (Monad m) => (b –> m c) –> (a –> m b) –> (a –> m c)

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

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π΄Π²ΡƒΡ… монадичСских Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

ghci> let f x = [x,-x]

ghci> let g x = [x*3,x*2]

ghci> let h = f <=< g

ghci> h 3

[9,-9,6,-6]

Π›Π°Π΄Π½ΠΎ, всё это Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ. Но ΠΊΠ°ΠΊΠΎΠ΅ это ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊ Π·Π°ΠΊΠΎΠ½Ρƒ ассоциативности? ΠŸΡ€ΠΎΡΡ‚ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ рассматриваСм этот Π·Π°ΠΊΠΎΠ½ ΠΊΠ°ΠΊ Π·Π°ΠΊΠΎΠ½ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ, ΠΎΠ½ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ f <=< (g <=< h) Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ (f <=< g) <=< h. Π­Ρ‚ΠΎ всСго лишь Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ способ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ для ΠΌΠΎΠ½Π°Π΄ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ значСния.

Если ΠΌΡ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° Π·Π°ΠΊΠΎΠ½Π° Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ использовали ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ <=<, Ρ‚ΠΎ Π·Π°ΠΊΠΎΠ½ Π»Π΅Π²ΠΎΠ³ΠΎ тоТдСства ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ монадичСской Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ f <=< return ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ просто Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ f. Π—Π°ΠΊΠΎΠ½ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ тоТдСства Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ return <=< f Ρ‚Π°ΠΊΠΆΠ΅ Π½ΠΈΡ‡Π΅ΠΌ Π½Π΅ отличаСтся ΠΎΡ‚ простого Π²Ρ‹Π·ΠΎΠ²Π° f. Π­Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ f являлась ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, ΠΈ Ρ‚ΠΎΠ³Π΄Π° (f . g) . h Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ f . (g . h), Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ f . id – всСгда Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ f, ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ id . f Ρ‚ΠΎΠΆΠ΅ Π½ΠΈΡ‡Π΅ΠΌ Π½Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°Π»ΠΎΡΡŒ Π±Ρ‹ ΠΎΡ‚ Π²Ρ‹Π·ΠΎΠ²Π° f.

Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ Π² ΠΎΠ±Ρ‰ΠΈΡ… Ρ‡Π΅Ρ€Ρ‚Π°Ρ… ознакомились с ΠΌΠΎΠ½Π°Π΄Π°ΠΌΠΈ ΠΈ ΠΈΠ·ΡƒΡ‡ΠΈΠ»ΠΈ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΌΠΎΠ½Π°Π΄Π° Maybe ΠΈ списковая ΠΌΠΎΠ½Π°Π΄Π°. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ‹ рассмотрим Ρ†Π΅Π»ΡƒΡŽ ΠΊΡƒΡ‡Ρƒ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΡ€ΡƒΡ‚Ρ‹Ρ… ΠΌΠΎΠ½Π°Π΄, Π° Ρ‚Π°ΠΊΠΆΠ΅ создадим Π½Π°ΡˆΡƒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ.

14

Π•Ρ‰Ρ‘ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ½Π°Π΄

ΠœΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ ΠΌΠΎΠ½Π°Π΄Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для получСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ с контСкстами ΠΈ примСнСния ΠΈΡ… ΠΊ функциям ΠΈ ΠΊΠ°ΠΊ использованиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° >>= ΠΈΠ»ΠΈ Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ do позволяСт Π½Π°ΠΌ ΡΡ„ΠΎΠΊΡƒΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° самих значСниях, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ контСкст обрабатываСтся Π·Π° нас.



ΠœΡ‹ познакомились с ΠΌΠΎΠ½Π°Π΄ΠΎΠΉ Maybe ΠΈ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ ΠΎΠ½Π° добавляСт ΠΊ значСниям контСкст Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ нСуспСха Π² вычислСниях. ΠœΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ ΠΎ списковой ΠΌΠΎΠ½Π°Π΄Π΅ ΠΈ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ Π»Π΅Π³ΠΊΠΎ ΠΎΠ½Π° позволяСт Π½Π°ΠΌ Π²Π½ΠΎΡΠΈΡ‚ΡŒ Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ Π² наши ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² ΠΌΠΎΠ½Π°Π΄Π΅ IO Π΄Π°ΠΆΠ΅ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²ΠΎΠΎΠ±Ρ‰Π΅ выяснили, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΌΠΎΠ½Π°Π΄Π°!

Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ Π΅Ρ‰Ρ‘ ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΌΠΎΠ½Π°Π΄Π°Ρ…. ΠœΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ наши ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ понятнСС, позволяя Π½Π°ΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ всС Ρ‚ΠΈΠΏΡ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΊΠ°ΠΊ монадичСскиС значСния. ИсслСдованиС ряда ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΡ€Π΅ΠΏΠΈΡ‚ нашС ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΌΠΎΠ½Π°Π΄.

ВсС ΠΌΠΎΠ½Π°Π΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ прСдстоит Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΏΠ°ΠΊΠ΅Ρ‚Π° mtl. Π’ языкС Haskell ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ являСтся ΡΠΎΠ²ΠΎΠΊΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. ΠŸΠ°ΠΊΠ΅Ρ‚ mtl ΠΈΠ΄Ρ‘Ρ‚ Π² поставкС с Haskell Platform, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρƒ вас, вСроятно, ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‚Π°ΠΊ Π»ΠΈ это, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ghc-pkg list Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС. Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ для языка Haskell Ρƒ вас ΡƒΠΆΠ΅ установлСны; ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ²Π»ΡΡ‚ΡŒΡΡ mtl, Π·Π° Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ слСдуСт Π½ΠΎΠΌΠ΅Ρ€ вСрсии.

Writer? Π― ΠΎ Π½Π΅ΠΉ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ знаю!

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ зарядили наш пистолСт ΠΌΠΎΠ½Π°Π΄ΠΎΠΉ Maybe, списковой ΠΌΠΎΠ½Π°Π΄ΠΎΠΉ ΠΈ ΠΌΠΎΠ½Π°Π΄ΠΎΠΉ IO. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ помСстим Π² ΠΏΠ°Ρ‚Ρ€ΠΎΠ½Π½ΠΈΠΊ ΠΌΠΎΠ½Π°Π΄Ρƒ Writer ΠΈ посмотрим, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ выстрСлим Сю!

ΠœΠ΅ΠΆΠ΄Ρƒ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ Maybe ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌ контСкстом Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ…ΡΡ вычислСний, Π° список – для Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… вычислСний, ΠΌΠΎΠ½Π°Π΄Π° Writer прСдусмотрСна для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ присоСдинСно Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²Π΅Π΄ΡƒΡ‰Π΅Π΅ сСбя Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ ΠΆΡƒΡ€Π½Π°Π»Π°. Монада Writer позволяСт Π½Π°ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ вычислСния, Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя обСспСчивая слияниС всСх ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² ΠΎΠ΄Π½ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π°Ρ‚Π΅ΠΌ присоСдиняСтся ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ.

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

isBigGang :: Int –> Bool

isBigGang x = x > 9

Ну Π° Ρ‡Ρ‚ΠΎ Ссли Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ вмСсто возвращСния значСния True ΠΈΠ»ΠΈ False ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ функция Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»Π° строку ΠΆΡƒΡ€Π½Π°Π»Π°, которая сообщаСт, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° сдСлала? Π§Ρ‚ΠΎ ΠΆ, ΠΌΡ‹ просто создаём эту строку ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π΅Ρ‘ наряду с нашим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Bool: