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

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

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

ΠœΡ‹ усаТиваСм ΠΏΡ‚ΠΈΡ†Ρƒ слСва, Π° Π·Π°Ρ‚Π΅ΠΌ провСряСм Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ ΠΈ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ успСха. Π’ случаС Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Nothing. Π’ случаС успСха усаТиваСм ΠΏΡ‚ΠΈΡ† справа, Π° Π·Π°Ρ‚Π΅ΠΌ повторяСм всё сызнова. ΠŸΡ€Π΅Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ этого убоТСства Π² ΡΠΈΠΌΠΏΠ°Ρ‚ΠΈΡ‡Π½ΡƒΡŽ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ монадичСских ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ с использованиСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ >>= являСтся классичСским ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠ½Π°Π΄Π° Maybe экономит массу Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ вычислСния, основанныС Π½Π° вычислСниях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³Π»ΠΈ ΠΎΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒΡΡ Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ рСализация ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ >>= для Ρ‚ΠΈΠΏΠ° Maybe ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ эту Π»ΠΎΠ³ΠΈΠΊΡƒ, ΠΊΠΎΠ³Π΄Π° провСряСтся, Ρ€Π°Π²Π½ΠΎ Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Nothing, ΠΈ дСйствиС производится Π½Π° основС этих свСдСний. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ Nothing, ΠΎΠ½Π° Π½Π΅Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Nothing. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Ρ€Π°Π²Π½ΠΎ Nothing, ΠΎΠ½Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ находится Π²Π½ΡƒΡ‚Ρ€ΠΈ конструктора Just.

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

Нотация do

ΠœΠΎΠ½Π°Π΄Ρ‹ Π² языкС Haskell Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ обзавСлись своим собствСнным синтаксисом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ называСтся «нотация doΒ». Π’Ρ‹ ΡƒΠΆΠ΅ познакомились с Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ do Π² Π³Π»Π°Π²Π΅ 8, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ использовали Π΅Ρ‘ для объСдинСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… дСйствий Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. Как оказываСтся, нотация do ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для систСмы Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для любой ΠΌΠΎΠ½Π°Π΄Ρ‹. Π•Ρ‘ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ остаётся ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌ: ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ «склСиваниС» монадичСских Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Рассмотрим этот Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ монадичСского примСнСния:

ghci> Just 3 >>= (\x –> Just (show x ++ "!"))

Just "3!"

Π­Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠ»ΠΈ! ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° монадичСского значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ монадичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, – Π½ΠΈΡ‡Π΅Π³ΠΎ особСнного. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ x становится Ρ€Π°Π²Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ 3 Π²Π½ΡƒΡ‚Ρ€ΠΈ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ выполняСм ΠΊΠΎΠ΄. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ Π²Π½ΡƒΡ‚Ρ€ΠΈ этой Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, это просто ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° Π½Π΅ монадичСскоС. А Ρ‡Ρ‚ΠΎ Ссли Π±Ρ‹ Ρƒ нас Π±Ρ‹Π» Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Π·ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° >>= Π²Π½ΡƒΡ‚Ρ€ΠΈ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ? ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅:

ghci> Just 3 >>= (\x –> Just "!" >>= (\y –> Just (show x ++ y)))

Just "3!"

Ага-Π°, Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ использованиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ >>=! Π’ΠΎ внСшнСй Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Just "!" Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ \y –> Just (show x ++ y). Π’Π½ΡƒΡ‚Ρ€ΠΈ этой Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ y становится Ρ€Π°Π²Π½Ρ‹ΠΌ "!". ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ x ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Ρ€Π°Π²Π΅Π½ 3, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΠΈΠ· внСшнСй Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Всё это ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΌΠ½Π΅ ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ:

ghci> let x = 3; y = "!" in show x ++ y

"3!"

Π“Π»Π°Π²Π½ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ значСния Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с использованиСм ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° >>= ΡΠ²Π»ΡΡŽΡ‚ΡΡ монадичСскими. Π­Ρ‚ΠΎ значСния с контСкстом Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ любоС ΠΈΠ· Π½ΠΈΡ… Π½Π° Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ:

ghci> Nothing >>= (\x –> Just "!" >>= (\y –> Just (show x ++ y))) Nothing

ghci> Just 3 >>= (\x –> Nothing >>= (\y –> Just (show x ++ y)))

Nothing

ghci> Just 3 >>= (\x –> Just "!" >>= (\y –> Nothing))

Nothing

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкС ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° значСния Nothing Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ СстСствСнным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΄Π°Ρ‘Ρ‚ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Nothing. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ строкС ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Just 3 Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ x становится Ρ€Π°Π²Π½Ρ‹ΠΌ 3. Но ΠΏΠΎΡ‚ΠΎΠΌ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Nothing Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ становится Nothing, Ρ‡Ρ‚ΠΎ заставляСт внСшнюю Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ‚ΠΎΠΆΠ΅ произвСсти Nothing Π² качСствС своСго Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Π­Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ присвоСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π² выраТСниях let, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ значСния, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ΄Ρ‘Ρ‚ Ρ€Π΅Ρ‡ΡŒ, ΡΠ²Π»ΡΡŽΡ‚ΡΡ монадичСскими.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту идСю, Π΄Π°Π²Π°ΠΉΡ‚Π΅ запишСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строки Π² сцСнарий Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Maybe Π·Π°Π½ΠΈΠΌΠ°Π»ΠΎ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ строку:

foo :: Maybe String

foo = Just 3 >>= (\x –>

      Just "!">>= (\y –>

      Just (show x ++ y)))

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Ρ€Π΅Ρ‡ΡŒ нас ΠΎΡ‚ написания всСх этих Ρ€Π°Π·Π΄Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΡ… Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, язык Haskell прСдоставляСт Π½Π°ΠΌ Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ do. Она позволяСт Π½Π°ΠΌ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ кусок ΠΊΠΎΠ΄Π° Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

foo :: Maybe String

foo = do

    x <– Just 3

    y <– Just "!"

    Just (show x ++ y)

Могло ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ сущности ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° Maybe Π±Π΅Π· нСобходимости ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡˆΠ°Π³Ρƒ, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π»ΠΈ значСния Ρ‚ΠΈΠΏΠ° Maybe значСниями Π² конструкторС Just ΠΈΠ»ΠΈ значСниями Nothing. Π’ΠΎΡ‚ классно!.. Если ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ пытаСмся ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ, Ρ€Π°Π²Π½ΠΎ Nothing, всё Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ do Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Π΅Ρ€Π½Ρ‘Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Nothing. ΠœΡ‹ Π²Ρ‹Π΄Ρ‘Ρ€Π³ΠΈΠ²Π°Π΅ΠΌ Π½Π°Ρ€ΡƒΠΆΡƒ ΠΈΡ… значСния (Ссли Ρ‚Π°ΠΊΠΎΠ²Ρ‹Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚) ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ бСспокойства ΠΎ контСкстС, ΠΈΠ΄ΡƒΡ‰Π΅ΠΌ с этими значСниями, Π½Π° ΠΏΠ»Π΅Ρ‡ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° >>=.

ВыраТСния do – это просто Π΄Ρ€ΡƒΠ³ΠΎΠΉ синтаксис для сцСплСния монадичСских Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Π”Π΅Π»Π°ΠΉ ΠΊΠ°ΠΊ я

Π’ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ do каТдая строка, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰Π°ΡΡΡ строкой let, являСтся монадичСским Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΅Ρ‘ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ символ <–. Если Ρƒ нас Π΅ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Maybe String ΠΈ ΠΌΡ‹ привязываСм Π΅Ρ‘ ΠΊ ΠΎΠ±Ρ€Π°Π·Ρ†Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ символа <–, этот ΠΎΠ±Ρ€Π°Π·Π΅Ρ† Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ String Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ использовали ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ >>= для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ монадичСских Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΌ функциям.

ПослСднСС монадичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ do – Ρ‚Π°ΠΊΠΎΠ΅ ΠΊΠ°ΠΊ Just (show x ++ y) Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ – Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использовано с символом <– для привязки Π΅Π³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ссли Π±Ρ‹ ΠΌΡ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π»ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ do ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° >>=, это Π½Π΅ ΠΈΠΌΠ΅Π»ΠΎ Π±Ρ‹ смысла. Наоборот, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ послСднСго выраТСния являСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ всСго склССнного монадичСского значСния, учитывая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡƒΡŽ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ вычислСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… монадичСских Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. РассмотритС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку:

ghci> Just 9 >>= (\x –> Just (x > 8))

Just True

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π»Π΅Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ >>= являСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² конструкторС Just, анонимная функция примСняСтся ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ 9, ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ становится Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Just True. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ это Π² Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ do ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

marySue :: Maybe Bool

marySue = do

   x <– Just 9

   Just (x > 8)

Бравнивая ΠΎΠ±Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°, Π»Π΅Π³ΠΊΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ всСго монадичСского значСния являСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ послСднСго монадичСского значСния Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ do со всСми ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌΠΈ монадичСскими значСниями, сцСплСнными с Π½ΠΈΠΌ.

ΠŸΡŒΠ΅Ρ€ возвращаСтся

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ нашСго ΠΊΠ°Π½Π°Ρ‚ΠΎΡ…ΠΎΠ΄Ρ†Π° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½Π° с использованиСм Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ do. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ landLeft ΠΈ landRight ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ количСство ΠΏΡ‚ΠΈΡ† ΠΈ ΡˆΠ΅ΡΡ‚ ΠΈ производят ΡˆΠ΅ΡΡ‚, ΠΎΠ±Ρ‘Ρ€Π½ΡƒΡ‚Ρ‹ΠΉ Π² Just. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ – это ΠΊΠΎΠ³Π΄Π° ΠΊΠ°Π½Π°Ρ‚ΠΎΡ…ΠΎΠ΄Π΅Ρ† ΡΠΎΡΠΊΠ°Π»ΡŒΠ·Ρ‹Π²Π°Π΅Ρ‚, ΠΈ Ρ‚ΠΎΠ³Π΄Π° возвращаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Nothing. ΠœΡ‹ использовали ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ >>= для сцСплСния ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… шагов, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… зависСл ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±Π»Π°Π΄Π°Π» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌ контСкстом Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ. Π—Π΄Π΅ΡΡŒ Π΄Π²Π΅ ΠΏΡ‚ΠΈΡ†Ρ‹ ΠΏΡ€ΠΈΠ·Π΅ΠΌΠ»ΡΡŽΡ‚ΡΡ с Π»Π΅Π²ΠΎΠΉ стороны, Π·Π°Ρ‚Π΅ΠΌ Π΄Π²Π΅ ΠΏΡ‚ΠΈΡ†Ρ‹ – с ΠΏΡ€Π°Π²ΠΎΠΉ, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΎΠ΄Π½Π° ΠΏΡ‚ΠΈΡ†Π° – снова с Π»Π΅Π²ΠΎΠΉ:

routine :: Maybe Pole

routine = do

   start <– return (0, 0)

   first <– landLeft 2 start

   second <– landRight 2 first

   landLeft 1 second

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, окончится Π»ΠΈ это ΡƒΠ΄Π°Ρ‡Π½ΠΎ для ΠŸΡŒΠ΅Ρ€Π°:

ghci> routine

Just (3,2)

ΠžΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΎΡΡŒ ΡƒΠ΄Π°Ρ‡Π½ΠΎ!

Когда ΠΌΡ‹ выполняли эти инструкции, явно записывая Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° >>=, ΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ писали Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ return (0, 0) >>= landLeft 2, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ функция landLeft являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Maybe. Однако ΠΏΡ€ΠΈ использовании выраТСния do каТдая строка Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ монадичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ явно ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Pole функциям landLeft ΠΈ landRight. Если Π±Ρ‹ ΠΌΡ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Π·Ρ†Ρ‹, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ привязали наши значСния Ρ‚ΠΈΠΏΠ° Maybe, Ρ‚ΠΎ start Π±Ρ‹Π» Π±Ρ‹ Ρ€Π°Π²Π΅Π½ (0, 0), first Π±Ρ‹Π» Π±Ρ‹ Ρ€Π°Π²Π΅Π½ (2, 0) ΠΈ Ρ‚. Π΄.