ΠΡΠ»ΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² Functor ΠΈ Monad Π΄Π»Ρ ΡΠΈΠΏΠ° ΠΏΠΎΠ΄ΡΠΈΠ½ΡΡΡΡΡ Π·Π°ΠΊΠΎΠ½Π°ΠΌ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ² ΠΈ ΠΌΠΎΠ½Π°Π΄, ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠΈΠΌΠΈ Π΄Π²ΡΠΌΡ Π½Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΡΠ°Π·Π½ΠΈΡΡ (ΠΈ Π²ΡΠ΅ ΠΌΠΎΠ½Π°Π΄Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Π΄ΠΎ ΡΠΈΡ ΠΏΠΎΡ Π²ΡΡΡΠ΅ΡΠ°Π»ΠΈ, ΠΏΠΎΠ΄ΡΠΈΠ½ΡΡΡΡΡ ΠΎΠ±ΠΎΠΈΠΌ). ΠΡΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΠΈ pure ΠΈ return, Π΄Π΅Π»Π°ΡΡΠΈΠ΅ ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅, β ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π° ΠΈΠΌΠ΅Π΅Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ° Applicative, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π΄ΡΡΠ³Π°Ρ ΠΈΠΌΠ΅Π΅Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Monad.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ liftM:
ghci> liftM (*3) (Just 8)
Just 24
ghci> fmap (*3) (Just 8)
Just 24
ghci> runWriter $ liftM not $ Writer (True, "Π³ΠΎΡΠΎΡ ")
(False,"Π³ΠΎΡΠΎΡ ")
ghci> runWriter $ fmap not $ Writer (True, "Π³ΠΎΡΠΎΡ ")
(False,"Π³ΠΎΡΠΎΡ ")
ghci> runState (liftM (+100) pop) [1,2,3,4]
(101,[2,3,4])
ghci> runState (fmap (+100) pop) [1,2,3,4]
(101,[2,3,4])
ΠΡ ΡΠΆΠ΅ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Ρ ΠΎΡΠΎΡΠΎ Π·Π½Π°Π΅ΡΠ΅, ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡ fmap ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΠΈΠΏΠ° Maybe. Π ΡΡΠ½ΠΊΡΠΈΡ liftM Π΄Π΅Π»Π°Π΅Ρ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅. ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΠΈΠΏΠ° Writer ΡΡΠ½ΠΊΡΠΈΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΊΠΎΡΡΠ΅ΠΆΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ. ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ fmap ΠΈΠ»ΠΈ liftM Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ΠΌ, ΠΈΠΌΠ΅ΡΡΠΈΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅, Π΄Π°ΡΡ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π΄ΡΡΠ³ΠΎΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ, Π½ΠΎ Π΅Π³ΠΎ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ. ΠΡΠ»ΠΈ Π±Ρ ΠΌΡ Π½Π΅ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ pop Ρ ΠΏΠΎΠΌΠΎΡΡΡ (+100) ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π΅Ρ, ΠΎΠ½Π° Π±Ρ Π²Π΅ΡΠ½ΡΠ»Π° (1, [2,3,4]).
ΠΠΎΡ ΠΊΠ°ΠΊ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΡΡΠ½ΠΊΡΠΈΡ liftM:
liftM :: (Monad m) => (a β> b) β> m a β> m b
liftM f m = m >>= (\x β> return (f x))
ΠΠ»ΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½ΠΎΡΠ°ΡΠΈΠΈ do:
liftM :: (Monad m) => (a β> b) β> m a β> m b
liftM f m = do
x <β m
return (f x)
ΠΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΌ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ m Π² ΡΡΠ½ΠΊΡΠΈΡ, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ ΠΊ Π΅Π³ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ Π΅Π³ΠΎ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠ²ΠΈΠ΄Ρ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΈΡ Π·Π°ΠΊΠΎΠ½ΠΎΠ² Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅ΡΡΡ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ; ΠΎΠ½Π° ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ Π»ΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
ΠΡ Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ liftM ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ ΡΡΡΠ»Π°ΡΡΡ Π½Π° ΠΊΠ»Π°ΡΡ ΡΠΈΠΏΠΎΠ² Functor. ΠΠ½Π°ΡΠΈΡ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ fmap (ΠΈΠ»ΠΈ liftM β Π½Π°Π·ΡΠ²Π°ΠΉΡΠ΅, ΠΊΠ°ΠΊ ΠΏΠΎΠΆΠ΅Π»Π°Π΅ΡΠ΅), ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π»ΠΈΡΡ ΡΠ΅ Π±Π»Π°Π³Π°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ Π½Π°ΠΌ ΠΌΠΎΠ½Π°Π΄Ρ. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΊΠ»ΡΡΠΈΡΡ, ΡΡΠΎ ΠΌΠΎΠ½Π°Π΄Ρ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ ΠΆΠ΅ ΡΠΈΠ»ΡΠ½Ρ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈ ΡΡΠ½ΠΊΡΠΎΡΡ.
ΠΠ»Π°ΡΡ ΡΠΈΠΏΠΎΠ² Applicative ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°ΠΌΠΈ, ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ Π±Ρ ΠΎΠ½ΠΈ Π±ΡΠ»ΠΈ ΠΎΠ±ΡΡΠ½ΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ, Π²ΠΎΡ ΡΠ°ΠΊ:
ghci> (+) <$> Just 3 <*> Just 5
Just 8
ghci> (+) <$> Just 3 <*> Nothing
Nothing
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΡΠΈΠ»Ρ Π²ΡΡ ΡΠΏΡΠΎΡΠ°Π΅Ρ. ΠΠΏΠ΅ΡΠ°ΡΠΈΡ <$> β ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ fmap, Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ <*> β ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· ΠΊΠ»Π°ΡΡΠ° ΡΠΈΠΏΠΎΠ² Applicative, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΠΌΠ΅Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠΈΠΏ:
(<*>) :: (Applicative f) => f (a β> b) β> f a β> f b
Π’Π°ΠΊ ΡΡΠΎ ΡΡΠΎ Π²ΡΠΎΠ΄Π΅ fmap, ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΌΠ° ΡΡΠ½ΠΊΡΠΈΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅. ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΈΠ·Π²Π»Π΅ΡΡ Π΅Ρ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΈ Ρ Π΅Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ f a, Π° Π·Π°ΡΠ΅ΠΌ Π²Π½ΠΎΠ²Ρ ΡΠΎΠ±ΡΠ°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΡΠ·ΡΠΊΠ΅ Haskell ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΊΠ°ΡΡΠΈΡΠΎΠ²Π°Π½Ρ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΠ΅ ΠΈΠ· ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ <$> ΠΈ <*> ΠΌΠ΅ΠΆΠ΄Ρ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ, ΡΡΠΎΠ±Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ².
ΠΠ΄Π½Π°ΠΊΠΎ, ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ, ΠΊΠ°ΠΊ ΠΈ ΡΡΠ½ΠΊΡΠΈΡ fmap, ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ <*> ΡΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π»ΠΈΡΡ ΡΠΎ, ΡΡΠΎ Π΄Π°ΡΡ Π½Π°ΠΌ ΠΊΠ»Π°ΡΡ ΡΠΈΠΏΠΎΠ² Monad. Π€ΡΠ½ΠΊΡΠΈΡ ap, ΠΏΠΎ ΡΡΡΠ΅ΡΡΠ²Ρ, β ΡΡΠΎ <*>, ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ Monad, Π° Π½Π΅ Applicative. ΠΠΎΡ Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅:
ap :: (Monad m) => m (a β> b) β> m a β> m b
ap mf m = do
f <β mf
x <β m
return (fx)
Π€ΡΠ½ΠΊΡΠΈΡ ap β ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ β ΡΡΠ½ΠΊΡΠΈΡ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠ°ΠΊ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅, ΠΌΡ Π±Π΅ΡΡΠΌ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΈ Π½Π°Π·ΡΠ²Π°Π΅ΠΌ Π΅Ρ f, Π·Π°ΡΠ΅ΠΌ Π±Π΅ΡΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ Π½Π°Π·ΡΠ²Π°Π΅ΠΌ Π΅Π³ΠΎ x, ΠΈ, Π² ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ², ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΡΠΎ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°. ΠΠΎΡ Π±ΡΡΡΡΠ°Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ:
ghci> Just (+3) <*> Just 4
Just 7
ghci> Just (+3) `ap` Just 4
Just 7
ghci> [(+1),(+2),(+3)] <*> [10,11]
[11,12,12,13,13,14]
ghci> [(+1),(+2),(+3)] `ap` [10,11]
[11,12,12,13,13,14]
Π’Π΅ΠΏΠ΅ΡΡ Π½Π°ΠΌ Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΠΌΠΎΠ½Π°Π΄Ρ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ ΠΆΠ΅ ΡΠΈΠ»ΡΠ½Ρ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΎΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΊΠ»Π°ΡΡΠ° Monad Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈΠ· ΠΊΠ»Π°ΡΡΠ° Applicative. ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°Π΅ΡΡΡ, ΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ ΡΠΈΠΏ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠΎΠ½Π°Π΄ΠΎΠΉ, Π·Π°ΡΠ°ΡΡΡΡ ΡΠ½Π°ΡΠ°Π»Π° Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Monad, Π° Π·Π°ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Applicative, ΠΏΡΠΎΡΡΠΎ Π³ΠΎΠ²ΠΎΡΡ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ pure β ΡΡΠΎ return, Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ <*> β ΡΡΠΎ ap. ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ ΡΠΆΠ΅ Π΅ΡΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Monad Π΄Π»Ρ ΡΠ΅Π³ΠΎ-Π»ΠΈΠ±ΠΎ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ Π΄Π»Ρ Π½Π΅Π³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Functor, ΠΏΡΠΎΡΡΠΎ Π³ΠΎΠ²ΠΎΡΡ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ fmap β ΡΡΠΎ liftM.
Π€ΡΠ½ΠΊΡΠΈΡ liftA2 Π²Π΅ΡΡΠΌΠ° ΡΠ΄ΠΎΠ±Π½Π° Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ. ΠΠ½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° Π²ΠΎΡ ΡΠ°ΠΊ:
liftA2 :: (Applicative f) => (a β> b β> c) β> f a β> f b β> f c
liftA2 f x y = f <$> x <*> y
Π€ΡΠ½ΠΊΡΠΈΡ liftM2 Π΄Π΅Π»Π°Π΅Ρ ΡΠΎ ΠΆΠ΅, Π½ΠΎ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Monad. ΠΡΡΡ ΡΠ°ΠΊΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ liftM3, liftM4 ΠΈ liftM5.
ΠΡ ΡΠ²ΠΈΠ΄Π΅Π»ΠΈ, ΡΡΠΎ ΠΌΠΎΠ½Π°Π΄Ρ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΡΠΈΠ»ΡΠ½Ρ, ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΎΡΡ ΠΈ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΎΡΡ β ΠΈ, Ρ ΠΎΡΡ Π²ΡΠ΅ ΠΌΠΎΠ½Π°Π΄Ρ, ΠΏΠΎ ΡΡΡΠΈ, ΡΠ²Π»ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΎΡΠ°ΠΌΠΈ ΠΈ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΎΡΠ°ΠΌΠΈ, Ρ Π½ΠΈΡ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠΌΠ΅ΡΡΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² Functor ΠΈ Applicative. ΠΡ ΠΈΠ·ΡΡΠΈΠ»ΠΈ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΎΡΠ°ΠΌΠΈ ΠΈ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΎΡΠ°ΠΌΠΈ.
Π€ΡΠ½ΠΊΡΠΈΡ join
ΠΡΡΡ ΠΊΠΎΠ΅-ΠΊΠ°ΠΊΠ°Ρ ΠΏΠΈΡΠ° Π΄Π»Ρ ΡΠ°Π·ΠΌΡΡΠ»Π΅Π½ΠΈΡ: Π΅ΡΠ»ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ β Π΅ΡΡ ΠΎΠ΄Π½ΠΎ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ (ΠΎΠ΄Π½ΠΎ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π²Π»ΠΎΠΆΠ΅Π½ΠΎ Π² Π΄ΡΡΠ³ΠΎΠ΅), ΠΌΠΎΠΆΠ΅ΡΠ΅ Π»ΠΈ Π²Ρ Β«ΡΠ°Π·Π³Π»Π°Π΄ΠΈΡΡΒ» ΠΈΡ Π΄ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π»ΠΈΡΡ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ? ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Ρ Π½Π°Ρ Π΅ΡΡΡ Just (Just 9), ΠΌΠΎΠΆΠ΅ΠΌ Π»ΠΈ ΠΌΡ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡ ΡΡΠΎ Π² Just 9? ΠΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ, ΡΡΠΎ Π»ΡΠ±ΠΎΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ°Π·Π³Π»Π°ΠΆΠ΅Π½ΠΎ, ΠΏΡΠΈΡΡΠΌ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ ΠΌΠΎΠ½Π°Π΄. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ join. ΠΡ ΡΠΈΠΏ ΡΠ°ΠΊΠΎΠ²:
join :: (Monad m) => m (m a) β> m a
ΠΠ½Π°ΡΠΈΡ, ΡΡΠ½ΠΊΡΠΈΡ join ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠΈ ΠΈ ΠΎΡΠ΄Π°ΡΡ Π½Π°ΠΌ ΠΏΡΠΎΡΡΠΎ ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅; Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΎΠ½Π° Π΅Π³ΠΎ ΡΠ°Π·Π³Π»Π°ΠΆΠΈΠ²Π°Π΅Ρ. ΠΠΎΡ ΠΎΠ½Π° Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΠΈΠΏΠ° Maybe:
ghci> join (Just (Just 9))
Just 9
ghci> join (Just Nothing)
Nothing
ghci> join Nothing
Nothing
Π ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ β ΡΡΠΏΠ΅ΡΠ½ΠΎΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ½ΠΈ ΠΎΠ±Π° ΠΏΡΠΎΡΡΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Ρ Π² ΠΎΠ΄Π½ΠΎ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅. ΠΠΎ Π²ΡΠΎΡΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Nothing ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΎ ΠΊΠ°ΠΊ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Just. ΠΡΡΠΊΠΈΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΡΠ°Π½ΡΡΠ΅ ΠΈΠΌΠ΅Π»ΠΈ Π΄Π΅Π»ΠΎ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ Maybe ΠΈ Ρ ΠΎΡΠ΅Π»ΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ β Π±ΡΠ΄Ρ ΡΠΎ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ <*> ΠΈΠ»ΠΈ >>= β Π²ΡΠ΅ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΠ»ΠΈ Π±ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° Just, ΡΡΠΎΠ±Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΡΡΠ°Π»ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Just. ΠΡΠ»ΠΈ Π½Π° ΠΏΡΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»Π° Ρ ΠΎΡΡ ΠΎΠ΄Π½Π° Π½Π΅ΡΠ΄Π°ΡΠ°, ΡΠΎ ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΡΠ²Π»ΡΠ»Π°ΡΡ Π½Π΅ΡΠ΄Π°ΡΠ°; Π½Π΅ΡΡΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΈ Π·Π΄Π΅ΡΡ. Π ΡΡΠ΅ΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠ΅ ΠΌΡ ΠΏΡΡΠ°Π΅ΠΌΡΡ ΡΠ°Π·Π³Π»Π°Π΄ΠΈΡΡ ΡΠΎ, ΡΡΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ Π²ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ Π½Π΅ΡΠ΄Π°ΡΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ β ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ΡΠ΄Π°ΡΠ°.
Π Π°Π·Π³Π»Π°ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠΎΠ² ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΈΠ½ΡΡΠΈΡΠΈΠ²Π½ΠΎ:
ghci> join [[1,2,3],[4,5,6]]
[1,2,3,4,5,6]
ΠΠ°ΠΊ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΈΠ΄Π΅ΡΡ, ΡΡΠ½ΠΊΡΠΈΡ join Π΄Π»Ρ ΡΠΏΠΈΡΠΊΠΎΠ² β ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ concat. Π§ΡΠΎΠ±Ρ ΡΠ°Π·Π³Π»Π°Π΄ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ½Π°Π΄Ρ Writer, ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ°ΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠ½Π°Π΄Ρ Writer, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΡ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ mappend:
ghci> runWriter $ join (Writer (Writer (1, "aaa"), "bbb"))
(1,"bbbaaa")
ΠΠ½Π΅ΡΠ½Π΅Π΅ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ "bbb" ΠΈΠ΄ΡΡ ΠΏΠ΅ΡΠ²ΡΠΌ, Π·Π°ΡΠ΅ΠΌ ΠΊ Π½Π΅ΠΌΡ ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½ΠΈΡΡΠ΅ΡΡΡ ΡΡΡΠΎΠΊΠ° "aaa". ΠΠ° ΠΈΠ½ΡΡΠΈΡΠΈΠ²Π½ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅, ΠΊΠΎΠ³Π΄Π° Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΈΠΏΠ° Writer, ΡΠ½Π°ΡΠ°Π»Π° Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π΅Π³ΠΎ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΆΡΡΠ½Π°Π», ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΌ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΡΡΠΎ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π²Π½ΡΡΡΠΈ Π½Π΅Π³ΠΎ.
Π Π°Π·Π³Π»Π°ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΌΠΎΠ½Π°Π΄Ρ Either ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° ΡΠ°Π·Π³Π»Π°ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΌΠΎΠ½Π°Π΄Ρ Maybe:
ghci> join (Right (Right 9)) :: Either String Int
Right 9
ghci> join (Right (Left "ΠΎΡΠΈΠ±ΠΊΠ°")) :: Either String Int
Left "ΠΎΡΠΈΠ±ΠΊΠ°"
ghci> join (Left "ΠΎΡΠΈΠ±ΠΊΠ°") :: Either String Int
Left "ΠΎΡΠΈΠ±ΠΊΠ°"
ΠΡΠ»ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ join ΠΊ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ, ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ΠΌ Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ, ΡΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ½Π°ΡΠ°Π»Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π²Π½Π΅ΡΠ½Π΅Π΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ, Π° Π·Π°ΡΠ΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠ΅Π΅. ΠΠ·Π³Π»ΡΠ½ΠΈΡΠ΅, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ:
ghci> runState (join (state $ \s β> (push 10, 1:2:s))) [0,0,0]