ghci> [x | x <β [1..50], '7' `elem` show x]
[7,17,27,37,47]
ΠΠΎΡΡΠΎΠΌΡ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΡ Π² Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ°Ρ ΡΠΏΠΈΡΠΊΠΎΠ² β ΡΡΠΎ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ guard.
Π₯ΠΎΠ΄ ΠΊΠΎΠ½ΡΠΌ
ΠΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π½Π΅Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΡΡΠΈ. Π‘ΠΊΠ°ΠΆΠ΅ΠΌ, Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΠ°Ρ ΠΌΠ°ΡΠ½Π°Ρ Π΄ΠΎΡΠΊΠ° ΠΈ Π½Π° Π½Π΅ΠΉ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π° ΡΠΈΠ³ΡΡΠ° β ΠΊΠΎΠ½Ρ. ΠΡ Ρ ΠΎΡΠΈΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΠΌΠΎΠΆΠ΅Ρ Π»ΠΈ ΠΊΠΎΠ½Ρ Π΄ΠΎΡΡΠΈΠ³Π½ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ Π² ΡΡΠΈ Ρ ΠΎΠ΄Π°. ΠΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠ°ΡΡ ΡΠΈΡΠ΅Π» Π΄Π»Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΊΠΎΠ½Ρ Π½Π° ΡΠ°Ρ ΠΌΠ°ΡΠ½ΠΎΠΉ Π΄ΠΎΡΠΊΠ΅. ΠΠ΅ΡΠ²ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ Π±ΡΠ΄Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΡΠΎΠ»Π±Π΅Ρ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ½ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ, Π° Π²ΡΠΎΡΠΎΠ΅ ΡΠΈΡΠ»ΠΎ β ΡΡΡΠΎΠΊΡ.
Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌ ΡΠΈΠΏΠ° Π΄Π»Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΊΠΎΠ½Ρ Π½Π° ΡΠ°Ρ ΠΌΠ°ΡΠ½ΠΎΠΉ Π΄ΠΎΡΠΊΠ΅.
type KnightPos = (Int, Int)
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ ΠΊΠΎΠ½Ρ Π½Π°ΡΠΈΠ½Π°Π΅Ρ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ (6, 2). ΠΠΎΠΆΠ΅Ρ Π»ΠΈ ΠΎΠ½ Π΄ΠΎΠ±ΡΠ°ΡΡΡΡ Π΄ΠΎ (6, 1) ΠΈΠΌΠ΅Π½Π½ΠΎ Π·Π° ΡΡΠΈ Ρ ΠΎΠ΄Π°? ΠΠ°ΠΊΠΎΠΉ Ρ ΠΎΠ΄ Π»ΡΡΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΈΠ· Π΅Π³ΠΎ Π½ΡΠ½Π΅ΡΠ½Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ? Π― Π·Π½Π°Ρ: ΠΊΠ°ΠΊ Π½Π°ΡΡΡΡ ΠΈΡ Π²ΡΠ΅Ρ ?! Π Π½Π°ΡΠΈΠΌ ΡΡΠ»ΡΠ³Π°ΠΌ Π½Π΅Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π²ΡΠ±ΡΠ°ΡΡ ΠΎΠ΄ΠΈΠ½ Ρ ΠΎΠ΄, Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΡΠΎΡΡΠΎ Π²ΡΠ±Π΅ΡΠ΅ΠΌ ΠΈΡ Π²ΡΠ΅ ΡΡΠ°Π·Ρ! ΠΠΎΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±Π΅ΡΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΊΠΎΠ½Ρ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π²ΡΠ΅ Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Ρ ΠΎΠ΄Ρ:
moveKnight :: KnightPos β> [KnightPos]
moveKnight (c,r) = do
(c',r') <β [(c+2,r-1),(c+2,r+1),(c-2,r-1),(c-2,r+1)
,(c+1,r-2),(c+1,r+2),(c-1,r-2),(c-1,r+2)
]
guard (c' `elem` [1..8] && r' `elem` [1..8])
return (c',r')
ΠΠΎΠ½Ρ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠΆΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡΡΡ Π½Π° ΠΎΠ΄Π½Ρ ΠΊΠ»Π΅ΡΠΊΡ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΠΎ ΠΈΠ»ΠΈ Π²Π΅ΡΡΠΈΠΊΠ°Π»ΡΠ½ΠΎ ΠΈ Π½Π° Π΄Π²Π΅ ΠΊΠ»Π΅ΡΠΊΠΈ Π²Π΅ΡΡΠΈΠΊΠ°Π»ΡΠ½ΠΎ ΠΈΠ»ΠΈ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΠΎ, ΠΏΡΠΈΡΡΠΌ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π΅Π³ΠΎ Ρ ΠΎΠ΄ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΠΈ, ΠΈ ΠΏΠΎ Π²Π΅ΡΡΠΈΠΊΠ°Π»ΠΈ. ΠΠ°ΡΠ° (c', r') ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠΉ, Π° Π·Π°ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ guard Π·Π°Π±ΠΎΡΠΈΡΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π½ΠΎΠ²ΡΠΉ Ρ ΠΎΠ΄, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠ°ΡΠ° (c', r'), Π±ΡΠ» Π² ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ Π΄ΠΎΡΠΊΠΈ. ΠΡΠ»ΠΈ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π²ΡΡ ΠΎΠ΄ΠΈΡ Π·Π° Π΄ΠΎΡΠΊΡ, ΠΎΠ½Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΡΡΡΠΎΠΉ ΡΠΏΠΈΡΠΎΠΊ, ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π½Π΅ΡΠ΄Π°ΡΠ΅, ΠΈ Π²ΡΠ·ΠΎΠ² return (c', r') Π½Π΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ.
ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΠΏΠΈΡΠ°Π½Π° ΠΈ Π±Π΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠΎΠ² Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΌΠΎΠ½Π°Π΄. ΠΠΎΡ ΠΊΠ°ΠΊ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π΅Ρ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ filter:
moveKnight :: KnightPos β> [KnightPos]
moveKnight (c,r) = filter onBoard
[(c+2,r-1),(c+2,r+1),(c-2,r-1),(c-2,r+1)
,(c+1,r-2),(c+1,r+2),(c-1,r-2),(c-1,r+2)
]
where onBoard (c,r) = c `elem` [1..8] && r `elem` [1..8]
ΠΠ±Π΅ Π²Π΅ΡΡΠΈΠΈ Π΄Π΅Π»Π°ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅, ΡΠ°ΠΊ ΡΡΠΎ Π²ΡΠ±ΠΈΡΠ°ΠΉΡΠ΅ ΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΊΠ°ΠΆΠ΅ΡΡΡ Π²Π°ΠΌ Π»ΡΡΡΠ΅. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ:
ghci> moveKnight (6, 2)
[(8,1),(8,3),(4,1),(4,3),(7,4),(5,4)]
ghci> moveKnight (8, 1)
[(6,2),(7,3)]
Π Π°Π±ΠΎΡΠ°Π΅Ρ ΡΡΠ΄Π΅ΡΠ½ΠΎ! ΠΡ Π±Π΅ΡΡΠΌ ΠΎΠ΄Π½Ρ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΈ ΠΏΡΠΎΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ Ρ ΠΎΠ΄Ρ ΡΡΠ°Π·Ρ, ΡΠ°ΠΊ ΡΠΊΠ°Π·Π°ΡΡ.
ΠΠΎΡΡΠΎΠΌΡ ΡΠ΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ Π½Π΅Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΠΏΠΎΠ·ΠΈΡΠΈΡ, ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ >>=, ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ moveKnight. ΠΠΎΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠ°Ρ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ°Ρ Π²ΡΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄ΠΎΡΡΠΈΠ³Π½ΡΡΡ ΠΈΠ· Π½Π΅Ρ Π² ΡΡΠΈ Ρ ΠΎΠ΄Π°:
in3 :: KnightPos β> [KnightPos]
in3 start = do
first <β moveKnight start
second <β moveKnight first
moveKnight second
ΠΡΠ»ΠΈ Π²Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π΄ΠΈΡΠ΅ Π΅ΠΉ ΠΏΠ°ΡΡ (6, 2), ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ ΡΠΏΠΈΡΠΎΠΊ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π±ΠΎΠ»ΡΡΠΈΠΌ. ΠΡΠΈΡΠΈΠ½Π° Π² ΡΠΎΠΌ, ΡΡΠΎ Π΅ΡΠ»ΠΈ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΡΠ΅ΠΉ Π΄ΠΎΡΡΠΈΠ³Π½ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ Π² ΡΡΠΈ Ρ ΠΎΠ΄Π°, Ρ ΠΎΠ΄ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ Π² ΡΠΏΠΈΡΠΊΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·.
ΠΠΎΡ ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ Π±Π΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π½ΠΎΡΠ°ΡΠΈΠΈ do:
in3 start = return start >>= moveKnight >>= moveKnight >>= moveKnight
ΠΠ΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ >>= Π΄Π°ΡΡ Π½Π°ΠΌ Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ Ρ ΠΎΠ΄Ρ Ρ Π½Π°ΡΠ°Π»Π°. ΠΠΎΠ³Π΄Π° ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ >>= Π²ΡΠΎΡΠΎΠΉ ΡΠ°Π·, ΡΠΎ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Ρ ΠΎΠ΄Π° Π²ΡΡΠΈΡΠ»ΡΠ΅ΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΉ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Ρ ΠΎΠ΄; ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π²Π΅ΡΠ½ΠΎ ΠΈ Π² ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ Ρ ΠΎΠ΄Π°.
ΠΠΎΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊ Π½Π΅ΠΌΡ ΡΡΠ½ΠΊΡΠΈΠΈ return, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° Π΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ >>= β ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ ΠΎΠ±ΡΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ; Π½ΠΎ ΠΌΡ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΡΡΠΎ Π·Π΄Π΅ΡΡ, Π²ΠΎ Π²ΡΡΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΡΠ°Π΄ΠΈ ΡΡΠΈΠ»Ρ.
Π’Π΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π΄Π²Π΅ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΈ ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ Π½Π°ΠΌ, ΠΌΠΎΠΆΠ΅ΠΌ Π»ΠΈ ΠΌΡ ΠΏΠΎΠΏΠ°ΡΡΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ Π² Π΄ΡΡΠ³ΡΡ ΡΠΎΠ²Π½ΠΎ Π² ΡΡΠΈ Ρ ΠΎΠ΄Π°:
canReachIn3 :: KnightPos β> KnightPos β> Bool
canReachIn3 start end = end `elem` in3 start
ΠΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌ Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ Π² ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ ΡΡΡΡ Ρ ΠΎΠ΄ΠΎΠ², Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π»ΠΈ ΡΡΠ΅Π΄ΠΈ Π½ΠΈΡ ΠΈΡΠΊΠΎΠΌΠ°Ρ.
ΠΠΎΡ ΠΊΠ°ΠΊ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΠΌΠΎΠΆΠ΅ΠΌ Π»ΠΈ ΠΌΡ ΠΏΠΎΠΏΠ°ΡΡΡ ΠΈΠ· (6,2) Π² (6,1) Π² ΡΡΠΈ Ρ ΠΎΠ΄Π°:
ghci> (6, 2) `canReachIn3` (6, 1)
True
ΠΠ°! ΠΠ°ΠΊ Π½Π°ΡΡΡΡ ΠΈΠ· (6, 2) Π² (7, 3)?
ghci> (6, 2) `canReachIn3` (7, 3)
False
ΠΠ΅Ρ! Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΎΠ½Π° ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π»Π° Π²Π°ΠΌ Ρ ΠΎΠ΄Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ²Π΅ΡΡΠΈΡΡ, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄ΠΎΡΡΠΈΠ³Π½ΡΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠΉ. Π Π³Π»Π°Π²Π΅ 14 Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅, ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΡΡΠΎΠ±Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π΅ΠΉ ΡΠΈΡΠ»ΠΎ Ρ ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ, Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΎ ΡΠΈΡΠ»ΠΎ ΠΆΡΡΡΠΊΠΎ, ΠΊΠ°ΠΊ ΡΠ΅ΠΉΡΠ°Ρ.
ΠΠ°ΠΊΠΎΠ½Ρ ΠΌΠΎΠ½Π°Π΄
Π’Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π² ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ² ΠΈ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΡ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ², Π² ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΈ ΠΌΠΎΠ½Π°Π΄ Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΊΠΎΠ½ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΌ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠ΄ΡΠΈΠ½ΡΡΡΡΡ Π²ΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΊΠ»Π°ΡΡΠ° Monad. ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΡΡΠΎ-ΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° ΡΠΈΠΏΠΎΠ² Monad, ΡΡΠΎ Π΅ΡΡ Π½Π΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΏΠ΅ΡΠ΅Π΄ Π½Π°ΠΌΠΈ ΠΌΠΎΠ½Π°Π΄Π°. Π§ΡΠΎΠ±Ρ ΡΠΈΠΏ ΠΏΠΎ-Π½Π°ΡΡΠΎΡΡΠ΅ΠΌΡ Π±ΡΠ» ΠΌΠΎΠ½Π°Π΄ΠΎΠΉ, Π΄Π»Ρ Π½Π΅Π³ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π·Π°ΠΊΠΎΠ½Ρ ΠΌΠΎΠ½Π°Π΄. ΠΡΠΈ Π·Π°ΠΊΠΎΠ½Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π½Π°ΠΌ Π΄Π΅Π»Π°ΡΡ ΠΎΠ±ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎ ΡΠΈΠΏΠ΅ ΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ.
Π―Π·ΡΠΊ Haskell ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π»ΡΠ±ΠΎΠΌΡ ΡΠΈΠΏΡ Π±ΡΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΡΠΈΠΏΠΎΠ², ΠΏΠΎΠΊΠ° ΡΠΈΠΏΡ ΡΠ΄Π°ΡΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ. ΠΠΏΡΠΎΡΠ΅ΠΌ, ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π»ΠΈ Π·Π°ΠΊΠΎΠ½Ρ ΠΌΠΎΠ½Π°Π΄ Π΄Π»Ρ ΡΠΈΠΏΠ°, ΠΏΠΎΡΡΠΎΠΌΡ Π΅ΡΠ»ΠΈ ΠΌΡ ΡΠΎΠ·Π΄Π°ΡΠΌ Π½ΠΎΠ²ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° ΡΠΈΠΏΠΎΠ² Monad, ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠ±Π»Π°Π΄Π°ΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΠΉ ΡΠ²Π΅ΡΠ΅Π½Π½ΠΎΡΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π·Π°ΠΊΠΎΠ½ΠΎΠ² ΠΌΠΎΠ½Π°Π΄ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π²ΡΡ Ρ ΠΎΡΠΎΡΠΎ. ΠΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»Π°Π³Π°ΡΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ ΡΠΈΠΏΡ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡ Π·Π°ΠΊΠΎΠ½Π°ΠΌ, Π½ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΡΠΌ ΠΊ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΌΠΎΠ½Π°Π΄, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°ΠΊΠΎΠ½ΠΎΠ² Π²ΡΡΡΠ½ΡΡ. ΠΠΏΡΠΎΡΠ΅ΠΌ, Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΉΡΠ΅ΡΡ β ΡΡΠΈ Π·Π°ΠΊΠΎΠ½Ρ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ ΡΠ»ΠΎΠΆΠ½Ρ!
ΠΠ΅Π²Π°Ρ Π΅Π΄ΠΈΠ½ΠΈΡΠ°
ΠΠ΅ΡΠ²ΡΠΉ Π·Π°ΠΊΠΎΠ½ ΠΌΠΎΠ½Π°Π΄ ΡΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ Π±Π΅ΡΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ Π΅Π³ΠΎ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ return, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΌ Π΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ >>=, ΡΡΠΎ ΡΠ°Π²Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎ ΡΠΎΠΌΡ, ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ Π±Ρ ΠΌΡ ΠΏΡΠΎΡΡΠΎ Π²Π·ΡΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠ»ΠΈ ΠΊ Π½Π΅ΠΌΡ ΡΡΠ½ΠΊΡΠΈΡ. ΠΠΎΠ²ΠΎΡΡ ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, return x >>= f β ΡΡΠΎ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ f x.
ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊ Π½Π° Π·Π½Π°ΡΠ΅Π½ΠΈΡ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠΌ ΠΈ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ return ΠΊΠ°ΠΊ Π½Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΅Π³ΠΎ Π² ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠΎ Π·Π°ΠΊΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ». ΠΡΠ»ΠΈ Π΄Π°Π½Π½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π΅Π½, ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΈΠ»ΡΠ½ΠΎ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΠΎΡ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊ ΠΎΠ±ΡΡΠ½ΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ β ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, Π²ΠΎΠΎΠ±ΡΠ΅ Π½ΠΈΡΠ΅ΠΌ Π½Π΅ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ.
Π€ΡΠ½ΠΊΡΠΈΡ return Π΄Π»Ρ ΠΌΠΎΠ½Π°Π΄Ρ Maybe ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΠΊΠ°ΠΊ Π²ΡΠ·ΠΎΠ² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° Just. ΠΡΡ ΡΡΡΡ ΠΌΠΎΠ½Π°Π΄Ρ Maybe ΡΠΎΡΡΠΎΠΈΡ Π² Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΌ Π½Π΅ΡΡΠΏΠ΅Ρ Π΅ Π² Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡΡ , ΠΈ Π΅ΡΠ»ΠΈ Ρ Π½Π°Ρ Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ Π² ΡΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ, Π΅ΡΡΡ ΡΠΌΡΡΠ» Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊΠΈΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΠΎΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ return Ρ ΡΠΈΠΏΠΎΠΌ Maybe:
ghci> return 3 >>= (\x β> Just (x+100000))
Just 100003
ghci> (\x β> Just (x+100000)) 3
Just 100003
ΠΠ»Ρ ΡΠΏΠΈΡΠΊΠΎΠ²ΠΎΠΉ ΠΌΠΎΠ½Π°Π΄Ρ ΡΡΠ½ΠΊΡΠΈΡ return ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΡΡΠΎ-Π»ΠΈΠ±ΠΎ Π² ΠΎΠ΄Π½ΠΎΡΠ»Π΅ΠΌΠ΅Π½ΡΠ½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ >>= Π΄Π»Ρ ΡΠΏΠΈΡΠΊΠΎΠ² ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎ Π²ΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌ Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ ΠΊ Π½ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ. ΠΠ΄Π½Π°ΠΊΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΠΎΠ΄Π½ΠΎΡΠ»Π΅ΠΌΠ΅Π½ΡΠ½ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅ Π»ΠΈΡΡ ΠΎΠ΄Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΡΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ:
ghci> return "WoM" >>= (\x β> [x,x,x])
["WoM","WoM","WoM"]
ghci> (\x β> [x,x,x]) "WoM"
["WoM","WoM","WoM"]
ΠΡ Π·Π½Π°Π΅ΡΠ΅, ΡΡΠΎ Π΄Π»Ρ ΠΌΠΎΠ½Π°Π΄Ρ IO ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ return ΡΠΎΠ·Π΄Π°ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΠΏΠΎΠ±ΠΎΡΠ½ΡΡ ΡΡΡΠ΅ΠΊΡΠΎΠ², Π½ΠΎ ΠΏΡΠΎΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°. ΠΠΎ ΡΡΠΎΠΌΡ Π²ΠΏΠΎΠ»Π½Π΅ Π»ΠΎΠ³ΠΈΡΠ½ΠΎ, ΡΡΠΎ ΡΡΠΎΡ Π·Π°ΠΊΠΎΠ½ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΈ Π΄Π»Ρ ΠΌΠΎΠ½Π°Π΄Ρ IO.
ΠΡΠ°Π²Π°Ρ Π΅Π΄ΠΈΠ½ΠΈΡΠ°
ΠΡΠΎΡΠΎΠΉ Π·Π°ΠΊΠΎΠ½ ΡΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ, ΡΡΠΎ Π΅ΡΠ»ΠΈ Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ >>= Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ return, ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ Π½Π°ΡΠ΅ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. Π€ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ m >>= return ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ ΡΠ΅ΠΌ ΠΈΠ½ΡΠΌ, ΠΊΠ°ΠΊ ΠΏΡΠΎΡΡΠΎ m.
ΠΡΠΎΡ Π·Π°ΠΊΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΡ ΠΌΠ΅Π½Π΅Π΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π΅Π½, ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ²ΡΠΉ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΏΠΎΡΠ΅ΠΌΡ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ. ΠΠΎΠ³Π΄Π° ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΌ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ >>=, ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΎΠ±ΡΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΈΠ΅. Π€ΡΠ½ΠΊΡΠΈΡ return ΡΠΎΠΆΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΊΠΎΠΉ, Π΅ΡΠ»ΠΈ Π²Ρ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΡΠ΅ Π΅Ρ ΡΠΈΠΏ.