((),[10,1,2,0,0,0])
ΠΠ΄Π΅ΡΡ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅, ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ 2 ΠΈ 1 Π² ΡΡΠ΅ΠΊ ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ push 10 ΠΊΠ°ΠΊ ΡΠ²ΠΎΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ. ΠΠΎΡΡΠΎΠΌΡ ΠΊΠΎΠ³Π΄Π° Π²ΡΡ ΡΡΠΎ ΡΠ°Π·Π³Π»Π°ΠΆΠΈΠ²Π°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ join, Π° Π·Π°ΡΠ΅ΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ, Π²ΡΡ ΡΡΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ½Π°ΡΠ°Π»Π° ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ 2 ΠΈ 1 Π² ΡΡΠ΅ΠΊ, Π° Π·Π°ΡΠ΅ΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ push 10, ΠΏΡΠΎΡΠ°Π»ΠΊΠΈΠ²Π°Ρ ΡΠΈΡΠ»ΠΎ 10 Π½Π° Π²Π΅ΡΡ ΡΡΠΊΡ.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ join ΡΠ°ΠΊΠΎΠ²Π°:
join :: (Monad m) => m (m a) β> m a
join mm = do
m <β mm
m
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ mm ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ, ΠΌΡ Π±Π΅ΡΡΠΌ ΡΡΠΎΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ Π΅Π³ΠΎ Π½Π° Π΅Π³ΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΡΡΡΠΎΠΊΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΡΠΎ ΠΈ Π΅ΡΡΡ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. Π’ΡΡΠΊ Π·Π΄Π΅ΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ m <β mm, ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΌΠΎΠ½Π°Π΄Ρ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ Π½Π°Ρ ΠΎΠ΄ΠΈΠΌΡΡ, Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½. ΠΠΎΡ ΠΏΠΎΡΠ΅ΠΌΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΈΠΏΠ° Maybe Π΄Π°ΡΡ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Just, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΠΈ Π²Π½Π΅ΡΠ½Π΅Π΅, ΠΈ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ²Π»ΡΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ Just. ΠΠΎΡ ΠΊΠ°ΠΊ ΡΡΠΎ Π²ΡΠ³Π»ΡΠ΄Π΅Π»ΠΎ Π±Ρ, Π΅ΡΠ»ΠΈ Π±Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ mm Π±ΡΠ»ΠΎ Π·Π°ΡΠ°Π½Π΅Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ Π² Just (Just 8):
joinedMaybes :: Maybe Int
joinedMaybes = do
m <β Just (Just 8)
m
ΠΠ°Π²Π΅ΡΠ½ΠΎΠ΅, ΡΠ°ΠΌΠΎΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠ΅ Π² ΡΡΠ½ΠΊΡΠΈΠΈ join β ΡΠΎ, ΡΡΠΎ Π΄Π»Ρ Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠ½Π°Π΄Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² ΡΡΠ½ΠΊΡΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ >>= ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ ΠΏΡΠΎΡΡΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, Π° Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ join Π΄Π»Ρ ΡΠ°Π·Π³Π»Π°ΠΆΠΈΠ²Π°Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠ΅Π³ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ! ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ m >>= f β Π²ΡΠ΅Π³Π΄Π° ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ join (fmap f m). ΠΡΠ»ΠΈ Π²Π΄ΡΠΌΠ°ΡΡΡΡ, ΡΡΠΎ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ».
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ >>= ΠΌΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π΄ΡΠΌΠ°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΎΠ±ΡΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅. ΠΡΠ»ΠΈ ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΠΌ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π²Π½ΡΡΡΠΈ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΊΠ°ΠΆΠ΅ΠΌ, Ρ Π½Π°Ρ Π΅ΡΡΡ Just 9 ΠΈ ΡΡΠ½ΠΊΡΠΈΡ \x β> Just (x+1). ΠΡΠ»ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΡ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΠΌ Just 9, Ρ Π½Π°Ρ ΠΎΡΡΠ°Π½Π΅ΡΡΡ Just (Just 10).
Π’ΠΎ, ΡΡΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ m >>= f Π²ΡΠ΅Π³Π΄Π° ΡΠ°Π²Π½ΠΎ join (fmap f m), ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Π΅ΡΠ»ΠΈ ΠΌΡ ΡΠΎΠ·Π΄Π°ΡΠΌ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Monad Π΄Π»Ρ Π½Π΅ΠΊΠΎΠ΅Π³ΠΎ ΡΠΈΠΏΠ°. ΠΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ Π·Π°ΡΠ°ΡΡΡΡ ΠΏΡΠΎΡΠ΅ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊ ΠΌΡ Π±Ρ ΡΠ°Π·Π³Π»Π°Π΄ΠΈΠ»ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΠ΅ΠΌ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ >>=.
ΠΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ ΡΠΎ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ join Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π°, Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΠ΅ ΡΡΠ½ΠΊΡΠΎΡΠ°ΠΌΠΈ ΠΈ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΎΡΠ°ΠΌΠΈ. ΠΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ Π½Π°Ρ ΠΊ Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΡΡΠΎ ΠΌΠΎΠ½Π°Π΄Ρ Π½Π΅ ΠΏΡΠΎΡΡΠΎ ΡΠΎΠΏΠΎΡΡΠ°Π²ΠΈΠΌΡ ΠΏΠΎ ΡΠ²ΠΎΠ΅ΠΉ ΡΠΈΠ»Π΅ Ρ ΡΡΠ½ΠΊΡΠΎΡΠ°ΠΌΠΈ ΠΈ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΎΡΠ°ΠΌΠΈ β ΠΎΠ½ΠΈ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΠΈΠ»ΡΠ½Π΅Π΅, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Ρ Π½ΠΈΠΌΠΈ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π΅Π»Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ Ρ ΡΡΠ½ΠΊΡΠΎΡΠ°ΠΌΠΈ ΠΈ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΎΡΠ°ΠΌΠΈ.
Π€ΡΠ½ΠΊΡΠΈΡ filterM
Π€ΡΠ½ΠΊΡΠΈΡ filter β ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ Ρ Π»Π΅Π± ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π° ΡΠ·ΡΠΊΠ΅ Haskell (ΠΏΡΠΈ ΡΠΎΠΌ ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ map β ΠΌΠ°ΡΠ»ΠΎ). ΠΠ½Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°Ρ ΠΈ ΡΠΏΠΈΡΠΎΠΊ, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°ΡΠΈΠΉ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ, Π° Π·Π°ΡΠ΅ΠΌ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΎΠ²ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ. ΠΡ ΡΠΈΠΏ ΡΠ°ΠΊΠΎΠ²:
filter :: (a β> Bool) β> [a] β> [a]
ΠΡΠ΅Π΄ΠΈΠΊΠ°Ρ Π±Π΅ΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΏΠΈΡΠΊΠ° ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Bool. Π Π²Π΄ΡΡΠ³ Π²ΠΎΠ·Π²ΡΠ°ΡΡΠ½Π½ΠΎΠ΅ ΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Bool Π±ΡΠ»ΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΈΠΌ? Π§ΡΠΎ Π΅ΡΠ»ΠΈ ΠΊ Π½Π΅ΠΌΡ Π±ΡΠ» ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ?.. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ True ΠΈΠ»ΠΈ False, ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄ΡΠ½Π½ΠΎΠ΅ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠΎΠΌ, ΠΈΠΌΠ΅Π»ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠΏΡΡΡΡΠ²ΡΡΡΠ΅Π΅ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠΎΠ΄Π΅ ["ΠΡΠΈΠ½ΡΡΠΎ ΡΠΈΡΠ»ΠΎ 5"] ΠΈΠ»ΠΈ ["3 ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ°Π»ΠΎ"]? ΠΡΠ»ΠΈ Π±Ρ ΡΡΠΎ Π±ΡΠ»ΠΎ ΡΠ°ΠΊ, ΠΌΡ Π±Ρ ΠΎΠΆΠΈΠ΄Π°Π»ΠΈ, ΡΡΠΎ ΠΊ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠ΅ΠΌΡ ΡΠΏΠΈΡΠΊΡ ΡΠΎΠΆΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Π΅ΡΡΡ ΠΆΡΡΠ½Π°Π» Π²ΡΠ΅Ρ ΠΆΡΡΠ½Π°Π»ΡΠ½ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ»ΠΈ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Ρ Π½Π° ΠΏΡΡΠΈ. ΠΠΎΡΡΠΎΠΌΡ Π΅ΡΠ»ΠΈ Π±Ρ ΠΊ ΡΠΏΠΈΡΠΊΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΡΠ½Π½ΠΎΠΌΡ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠΎΠΌ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Bool, Π±ΡΠ» ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ, ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π»ΠΈ Π±Ρ, ΡΡΠΎ ΠΊ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠ΅ΠΌΡ ΡΠΏΠΈΡΠΊΡ ΡΠΎΠΆΠ΅ ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»ΡΠ½ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ. ΠΠ½Π°ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΉ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΈΠΏΠ° Bool, Π±ΡΠ» Π±Ρ ΡΡΡΠ°ΡΠ΅Π½.
Π€ΡΠ½ΠΊΡΠΈΡ filterM ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Control.Monad Π΄Π΅Π»Π°Π΅Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠΎ, ΡΡΠΎ ΠΌΡ Ρ ΠΎΡΠΈΠΌ! ΠΡ ΡΠΈΠΏ ΡΠ°ΠΊΠΎΠ²:
filterM :: (Monad m) => (a β> m Bool) β> [a] β> m [a]
ΠΡΠ΅Π΄ΠΈΠΊΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ β ΡΠΈΠΏΠ° Bool, Π½ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π΅Π³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²ΡΠ΅ΠΌ ΡΠ΅ΠΌ ΡΠ³ΠΎΠ΄Π½ΠΎ, ΠΎΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ Π½Π΅ΡΠ΄Π°ΡΠΈ Π΄ΠΎ Π½Π΅Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΡΡΠΈ ΠΈ Π±ΠΎΠ»Π΅Π΅! Π§ΡΠΎΠ±Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΠΎΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π² ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅, ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠΎΠΆΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ.
ΠΠ°Π²Π°ΠΉΡΠ΅ Π²ΠΎΠ·ΡΠΌΡΠΌ ΡΠΏΠΈΡΠΎΠΊ ΠΈ ΠΎΡΡΠ°Π²ΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠ΅Π½ΡΡΠ΅ 4. ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΎΠ±ΡΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ filter:
ghci> filter (\x β> x < 4) [9,1,5,2,10,3]
[1,2,3]
ΠΡΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ. Π’Π΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° True ΠΈΠ»ΠΈ False ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΆΡΡΠ½Π°Π» ΡΠ²ΠΎΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ. ΠΠΎΠ½Π΅ΡΠ½ΠΎ ΠΆΠ΅, Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΎΠ½Π°Π΄Ρ Writer:
keepSmall :: Int β> Writer [String] Bool
keepSmall x
| x < 4 = do
tell ["Π‘ΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ " ++ show x]
return True
| otherwise = do
tell [show x ++ " ΡΠ»ΠΈΡΠΊΠΎΠΌ Π²Π΅Π»ΠΈΠΊΠΎ, Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌ"]
return False
ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΏΡΠΎΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Bool, ΡΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Writer [String] Bool. ΠΡΠΎ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°Ρ. ΠΠ²ΡΡΠΈΡ Π½Π΅ΠΎΠ±ΡΡΠ½ΠΎ, Π½Π΅ ΡΠ°ΠΊ Π»ΠΈ? ΠΡΠ»ΠΈ ΡΠΈΡΠ»ΠΎ ΠΌΠ΅Π½ΡΡΠ΅ ΡΠΈΡΠ»Π° 4, ΠΌΡ ΡΠΎΠΎΠ±ΡΠ°Π΅ΠΌ, ΡΡΠΎ ΠΎΡΡΠ°Π²ΠΈΠ»ΠΈ Π΅Π³ΠΎ, Π° Π·Π°ΡΠ΅ΠΌ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ True.
Π’Π΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π΄ΠΈΠΌ Π΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ filterM Π²ΠΌΠ΅ΡΡΠ΅ ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Writer, ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ ΡΠΏΠΈΡΠΎΠΊ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ΄Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΈΠΏΠ° Writer.
ghci> fst $ runWriter $ filterM keepSmall [9,1,5,2,10,3]
[1,2,3]
ΠΡΠΎΠ²Π΅ΡΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠ΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΌΠΎΠ½Π°Π΄Ρ Writer, ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ Π²ΡΡ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅. Π’Π΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΠΏΠ΅ΡΠ°ΡΠ°Π΅ΠΌ ΠΆΡΡΠ½Π°Π» ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΡΡΠΎ Ρ Π½Π°Ρ Π΅ΡΡΡ:
ghci> mapM_ putStrLn $ snd $ runWriter $ filterM keepSmall [9,1,5,2,10,3]
9 ΡΠ»ΠΈΡΠΊΠΎΠΌ Π²Π΅Π»ΠΈΠΊΠΎ, Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌ
Π‘ΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ 1
5 ΡΠ»ΠΈΡΠΊΠΎΠΌ Π²Π΅Π»ΠΈΠΊΠΎ, Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌ
Π‘ΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ 2
10 ΡΠ»ΠΈΡΠΊΠΎΠΌ Π²Π΅Π»ΠΈΠΊΠΎ, Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌ
Π‘ΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ 3
ΠΡΠ°ΠΊ, ΠΏΡΠΎΡΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°Ρ ΡΡΠ½ΠΊΡΠΈΠΈ filterM, ΠΌΡ ΡΠΌΠΎΠ³Π»ΠΈ ΡΠΈΠ»ΡΡΡΠΎΠ²Π°ΡΡ ΡΠΏΠΈΡΠΎΠΊ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ Π½Π°ΠΌΠΈ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°.
ΠΡΠ΅Π½Ρ ΠΊΡΡΡΠΎΠΉ ΡΡΡΠΊ Π² ΡΠ·ΡΠΊΠ΅ Haskell β ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ filterM Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°-ΡΡΠ΅ΠΏΠ΅Π½ΠΈ ΡΠΏΠΈΡΠΊΠ° (Π΅ΡΠ»ΠΈ ΠΌΡ ΡΠ΅ΠΉΡΠ°Ρ Π±ΡΠ΄Π΅ΠΌ Π΄ΡΠΌΠ°ΡΡ ΠΎ Π½ΡΠΌ ΠΊΠ°ΠΊ ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅). ΠΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ β ΡΡΠ΅ΠΏΠ΅Π½ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²ΡΠ΅Ρ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ² Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°. ΠΠΎΡΡΠΎΠΌΡ Π΅ΡΠ»ΠΈ Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²ΡΠΎΠ΄Π΅ [1,2,3], Π΅Π³ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ-ΡΡΠ΅ΠΏΠ΅Π½Ρ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°:
[1,2,3]
[1,2]
[1,3]
[1]
[2,3]
[2]
[3]
[]
ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°-ΡΡΠ΅ΠΏΠ΅Π½ΠΈ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΠΉ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈΠ· ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, [2,3] β ΡΡΠΎ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΈΡΠ»Π° 1; [1,2] β ΡΡΠΎ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΈΡΠ»Π° 3 ΠΈ Ρ. Π΄.
Π§ΡΠΎΠ±Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ-ΡΡΠ΅ΠΏΠ΅Π½Ρ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ ΡΠΏΠΈΡΠΊΠ°, ΠΌΡ ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌΡΡ Π½Π° Π½Π΅Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ. ΠΡ Π±Π΅ΡΡΠΌ ΡΠΏΠΈΡΠΎΠΊ [1,2,3], Π° Π·Π°ΡΠ΅ΠΌ ΡΠΌΠΎΡΡΠΈΠΌ Π½Π° ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π²Π΅Π½ 1, ΠΈ ΡΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΡΠ΅Π±Ρ: Β«ΠΠΎΠ»ΠΆΠ½Ρ Π»ΠΈ ΠΌΡ Π΅Π³ΠΎ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΈΠ»ΠΈ ΠΎΡΠ±ΡΠΎΡΠΈΡΡ?Β» ΠΡ, Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΌΡ Ρ ΠΎΡΠ΅Π»ΠΈ Π±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΈ ΡΠΎ ΠΈ Π΄ΡΡΠ³ΠΎΠ΅. ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ ΠΎΡΡΠΈΠ»ΡΡΡΡΠ΅ΠΌ ΡΠΏΠΈΡΠΎΠΊ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΠΈ ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° Π½Π΅Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΠΎ. ΠΠΎΡ Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ powerset:
powerset :: [a] β> [[a]]
powerset xs = filterM (\x β> [True, False]) xs
Π‘ΡΠΎΠΏ, ΡΡΠΎ Π²ΡΡ?! Π£Π³Ρ! ΠΡ ΡΠ΅ΡΠ°Π΅ΠΌ ΠΎΡΠ±ΡΠΎΡΠΈΡΡ ΠΈ ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΎΠ½ ΡΠΎΠ±ΠΎΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ. Π£ Π½Π°Ρ Π΅ΡΡΡ Π½Π΅Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°Ρ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ ΡΠΏΠΈΡΠΎΠΊ ΡΠΎΠΆΠ΅ Π±ΡΠ΄Π΅Ρ Π½Π΅Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ β ΠΈ ΠΏΠΎΡΠΎΠΌΡ Π±ΡΠ΄Π΅Ρ ΡΠΏΠΈΡΠΊΠΎΠΌ ΡΠΏΠΈΡΠΊΠΎΠ². ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ:
ghci> powerset [1,2,3]
[[1,2,3],[1,2],[1,3],[1],[2,3],[2],[3],[]]
ΠΠ°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΠ°Π·ΠΌΡΡΠ»ΠΈΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ ΡΡΠΎ. ΠΡΠΎΡΡΠΎ Π²ΠΎΡΠΏΡΠΈΠ½ΠΈΠΌΠ°ΠΉΡΠ΅ ΡΠΏΠΈΡΠΊΠΈ ΠΊΠ°ΠΊ Π½Π΅Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ»ΠΊΠΎΠΌ Π½Π΅ Π·Π½Π°ΡΡ, ΡΠ΅ΠΌ Π±ΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅ΡΠ°ΡΡ Π±ΡΡΡ ΡΡΠ°Π·Ρ Π²ΡΠ΅ΠΌ, β ΠΈ ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ ΡΡΠ°Π½Π΅Ρ ΠΏΡΠΎΡΠ΅ ΡΡΠ²ΠΎΠΈΡΡ!
Π€ΡΠ½ΠΊΡΠΈΡ foldM
ΠΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΈΠΌ Π°Π½Π°Π»ΠΎΠ³ΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ foldl ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ foldM. ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΎΠΌΠ½ΠΈΡΠ΅ ΡΠ²ΠΎΠΈ ΡΠ²ΡΡΡΠΊΠΈ ΠΈΠ· Π³Π»Π°Π²Ρ 5, Π²Ρ Π·Π½Π°Π΅ΡΠ΅, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ foldl ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π±ΠΈΠ½Π°ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡ ΠΈ ΡΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΡΠΉ ΡΠΏΠΈΡΠΎΠΊ, Π° Π·Π°ΡΠ΅ΠΌ ΡΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅Ρ Π΅Π³ΠΎ ΡΠ»Π΅Π²Π° Π² ΠΎΠ΄Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π±ΠΈΠ½Π°ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ. Π€ΡΠ½ΠΊΡΠΈΡ foldM Π΄Π΅Π»Π°Π΅Ρ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ½Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π±ΠΈΠ½Π°ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΡΡ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΈ ΡΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ Ρ Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. ΠΠ΅ΡΠ΄ΠΈΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, ΡΡΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠΆΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΈΠΌ. Π’ΠΈΠΏ ΡΡΠ½ΠΊΡΠΈΠΈ foldl ΡΠ°ΠΊΠΎΠ²: