ΠΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΉ ΡΡΠ½ΠΊΡΠΎΡ Maybe
ΠΠ°Π²Π°ΠΉΡΠ΅ Π²Π·Π³Π»ΡΠ½Π΅ΠΌ Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΊΠ»Π°ΡΡΠ° Applicative Π΄Π»Ρ ΡΠΈΠΏΠ° Maybe:
instance Applicative Maybe where
pure = Just
Nothing <*> _ = Nothing
(Just f) <*> something = fmap f something
ΠΠΏΡΡΡ ΠΆΠ΅ ΠΈΠ· ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ° ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ f, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ³ΡΠ°Π΅Ρ ΡΠΎΠ»Ρ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΎΡΠ°, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠΈΠΏ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°. ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ ΠΏΠΈΡΠ΅ΠΌ instance Applicative Maybe where Π²ΠΌΠ΅ΡΡΠΎ instance Applicative (Maybe a) where.
ΠΠ°Π»Π΅Π΅, Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ pure. ΠΡΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΡΠΎ-ΡΠΎ ΠΏΡΠΈΠ½ΡΡΡ ΠΈ ΠΎΠ±Π΅ΡΠ½ΡΡΡ Π² Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΡ Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ pure = Just, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ Π΄Π°Π½Π½ΡΡ Π²ΡΠΎΠ΄Π΅ Just ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ pure x = Just x.
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° <*>. ΠΠ·Π²Π»Π΅ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· Π·Π½Π°ΡΠ΅Π½ΠΈΡ Nothing Π½Π΅Π»ΡΠ·Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²Π½ΡΡΡΠΈ Π½Π΅Π³ΠΎ Π½Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ Π³ΠΎΠ²ΠΎΡΠΈΠΌ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΠΈΠ·Π²Π»Π΅ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· Π·Π½Π°ΡΠ΅Π½ΠΈΡ Nothing, ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Nothing.
Π ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΊΠ»Π°ΡΡΠ° Applicative Π΅ΡΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ° Functor β Π·Π½Π°ΡΠΈΡ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠΈΡΠ°ΡΡ, ΡΡΠΎ ΠΎΠ±Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° <*> ΡΠ²Π»ΡΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΎΡΠ°. ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ²ΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ Π²ΡΡΡΡΠΏΠ°Π΅Ρ Π½Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Nothing, Π° Just Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Π²Π½ΡΡΡΠΈ, ΡΠΎ ΠΌΡ Π³ΠΎΠ²ΠΎΡΠΈΠΌ, ΡΡΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ ΠΎΡΠΈΠΌ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ Π²ΡΠΎΡΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ. ΠΡΠΎΡ ΠΊΠΎΠ΄ ΡΠ°ΠΊΠΆΠ΅ Π·Π°Π±ΠΎΡΠΈΡΡΡ ΠΎ ΡΠ»ΡΡΠ°Π΅, ΠΊΠΎΠ³Π΄Π° Π²ΡΠΎΡΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Nothing, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π΅Π³ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π»ΡΠ±ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° fmap Π²Π΅ΡΠ½ΡΡ Π²ΡΡ ΡΠΎ ΠΆΠ΅ Nothing. ΠΡΠ°ΠΊ, Π² ΡΠ»ΡΡΠ°Π΅ Ρ ΡΠΈΠΏΠΎΠΌ Maybe ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ <*> ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ»Π΅Π²Π°, Π΅ΡΠ»ΠΈ ΡΡΠΎ Just, ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ Ρ Π΅Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΏΡΠ°Π²Π°. ΠΡΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Nothing, ΡΠΎ ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ Nothing.
Π’Π΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΡΠΎ ΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ:
ghci> Just (+3) <*> Just 9
Just 12
ghci> pure (+3) <*> Just 10
Just 13
ghci> pure (+3) <*> Just 9
Just 12
ghci> Just (++"Ρ Π°-Ρ Π°") <*> Nothing Nothing
ghci> Nothing <*> Just "Π²ΠΎ-ΠΎΡ"
Nothing
ΠΡ Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ pure (+3) ΠΈ Just (+3) Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ β ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ pure, Π΅ΡΠ»ΠΈ ΠΈΠΌΠ΅Π΅ΡΠ΅ Π΄Π΅Π»ΠΎ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΠΈΠΏΠ° Maybe Π² Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ (Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΠΈΡ Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ <*>); Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°ΠΉΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Just.
ΠΠ΅ΡΠ²ΡΠ΅ ΡΠ΅ΡΡΡΠ΅ Π²Π²Π΅Π΄ΡΠ½Π½ΡΡ ΡΡΡΠΎΠΊΠΈ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΡΡ, ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΡΡΡ, Π° Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ; Π½ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π΄ΠΎΠ±ΠΈΡΡΡΡ, ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠ² Π½Π΅ ΠΎΠ±ΡΡΠ½ΡΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊ ΡΡΠ½ΠΊΡΠΎΡΠ°ΠΌ. ΠΠΎΡΠ»Π΅Π΄Π½ΡΡ ΡΡΡΠΎΠΊΠ° Π»ΡΠ±ΠΎΠΏΡΡΠ½Π° ΡΠ΅ΠΌ, ΡΡΠΎ ΠΌΡ ΠΏΡΡΠ°Π΅ΠΌΡΡ ΠΈΠ·Π²Π»Π΅ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· Π·Π½Π°ΡΠ΅Π½ΠΈΡ Nothing, Π° Π·Π°ΡΠ΅ΠΌ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌ Ρ Π΅Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π½Π΅ΡΡΠΎ, ΡΡΠΎ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π΄Π°ΡΡ Nothing.
ΠΠΎΠ³Π΄Π° Π²Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΠ΅ ΡΡΠ½ΠΊΡΠΎΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠ±ΡΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ², Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠ·Π²Π»Π΅ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ. ΠΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΎΡΡ, Ρ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π²Π°ΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΡΡΠ½ΠΊΡΠΎΡΠ°ΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΎΠ΄Π½Ρ ΡΡΠ½ΠΊΡΠΈΡ.
ΠΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΉ ΡΡΠΈΠ»Ρ
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠ»Π°ΡΡΠ° ΡΠΈΠΏΠΎΠ² Applicative ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² <*> Π² Π²ΠΈΠ΄Π΅ ΡΠ΅ΠΏΠΎΡΠΊΠΈ Π²ΡΠ·ΠΎΠ²ΠΎΠ², ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π»Π΅Π³ΠΊΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΡΠ°Π·Ρ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ, Π° Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΎΠ΄Π½ΠΈΠΌ. ΠΠ·Π³Π»ΡΠ½ΠΈΡΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π° ΡΡΠΎ:
ghci> pure (+) <*> Just 3 <*> Just 5
Just 8
ghci> pure (+) <*> Just 3 <*> Nothing
Nothing
ghci> pure (+) <*> Nothing <*> Just 5
Nothing
ΠΡ ΠΎΠ±Π΅ΡΠ½ΡΠ»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ + Π² Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π° Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ <*>, ΡΡΠΎΠ±Ρ Π²ΡΠ·Π²Π°ΡΡ Π΅Π³ΠΎ Ρ Π΄Π²ΡΠΌΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ, ΠΎΠ±Π° ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΡΠ²Π»ΡΡΡΡΡ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΡΠ°Π³ Π·Π° ΡΠ°Π³ΠΎΠΌ. ΠΠΏΠ΅ΡΠ°ΡΠΎΡ <*> Π»Π΅Π²ΠΎΠ°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π΅Π½; ΡΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ
pure (+) <*> Just 3 <*> Just 5
ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ Π²ΠΎΡ ΡΡΠΎ:
(pure (+) <*> Just 3) <*> Just 5
Π‘Π½Π°ΡΠ°Π»Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ + ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΡΡ Π² Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ β Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Maybe, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΡΠ½ΠΊΡΠΈΡ. ΠΡΠ°ΠΊ, Ρ Π½Π°Ρ Π΅ΡΡΡ pure (+), ΡΡΠΎ, ΠΏΠΎ ΡΡΡΠΈ, ΡΠ°Π²Π½ΠΎ Just (+). ΠΠ°Π»Π΅Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π²ΡΠ·ΠΎΠ² Just (+) <*> Just 3. ΠΠ³ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ Just (3+). ΠΡΠΎ ΠΈΠ·-Π·Π° ΡΠ°ΡΡΠΈΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ. ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠΎΠ»ΡΠΊΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ 3 ΠΊ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ + Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΊ Π½Π΅ΠΌΡ 3. ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Just (3+) <*> Just 5, ΡΡΠΎ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Just 8.
ΠΡ ΡΠ°Π·Π²Π΅ Π½Π΅ Π·Π΄ΠΎΡΠΎΠ²ΠΎ?! ΠΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΎΡΡ ΠΈ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΉ ΡΡΠΈΠ»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ pure f <*> x <*> y <*> β¦ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π²Π·ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, Π½Π΅ ΡΠ²Π»ΡΡΡΠΈΠ΅ΡΡ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ, ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ. Π€ΡΠ½ΠΊΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΡ Π·Π°Ρ ΠΎΡΠΈΠΌ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½Π° Π²ΡΠ΅Π³Π΄Π° ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΠ°Π³ Π·Π° ΡΠ°Π³ΠΎΠΌ ΠΌΠ΅ΠΆΠ΄Ρ Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° <*>.
ΠΡΠΎ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π΅ΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ΄ΠΎΠ±Π½ΡΠΌ ΠΈ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΌ, Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΡΠΈΠΌΠ΅ΠΌ Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΠΎΡ ΡΠ°ΠΊΡ, ΡΡΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ pure f <*> x ΡΠ°Π²Π½ΠΎ fmap f x. ΠΡΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π·Π°ΠΊΠΎΠ½ΠΎΠ² Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΡ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅; Π½ΠΎ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠ΄ΡΠΌΠ°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π·Π΄Π΅ΡΡ. Π€ΡΠ½ΠΊΡΠΈΡ pure ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΡΠ»ΠΈ ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠΌΠ΅ΡΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π° Π·Π°ΡΠ΅ΠΌ ΠΈΠ·Π²Π»Π΅ΡΡΠΌ Π΅Ρ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π²Π½ΡΡΡΠΈ Π΄ΡΡΠ³ΠΎΠ³ΠΎ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΎΡΠ°, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΡΡΠΎΡ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΉ ΡΡΠ½ΠΊΡΠΎΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠΌΠ΅ΡΡΠΎ Π·Π°ΠΏΠΈΡΠΈ pure f <*> x <*> y <*> β¦, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°ΡΡ fmap f x <*> y <*> β¦ ΠΠΎΡ ΠΏΠΎΡΠ΅ΠΌΡ ΠΌΠΎΠ΄ΡΠ»Ρ Control.Applicative ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ, Π½Π°Π·Π²Π°Π½Π½ΡΠΉ <$>, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΡΠΎ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ fmap Π² Π²ΠΈΠ΄Π΅ ΠΈΠ½ΡΠΈΠΊΡΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°. ΠΠΎΡ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½:
(<$>) :: (Functor f) => (a β> b) β> f a β> f b
f <$> x = fmap f x
ΠΠ ΠΠΠΠ§ΠΠΠΠ. ΠΡΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠΈΠΏΠΎΠ² Π½Π΅ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ ΠΈΠΌΡΠ½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΈΠ»ΠΈ ΠΈΠΌΡΠ½ Π΄ΡΡΠ³ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ. ΠΠ΄Π΅ΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ f Π² ΡΠΈΠ³Π½Π°ΡΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠΈΠΏΠ° Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠ»Π°ΡΡΠ°, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΡ, ΡΡΠΎ Π»ΡΠ±ΠΎΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΈΠΏΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΠΌΠ΅Π½ΡΠ΅Ρ f, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Functor. ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ f Π² ΡΠ΅Π»Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ x. Π’ΠΎΡ ΡΠ°ΠΊΡ, ΡΡΠΎ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ f Π΄Π»Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΎΠ±Π΅ΠΈΡ Π²Π΅ΡΠ΅ΠΉ, Π½Π΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ Π²Π΅ΡΡ.
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° <$> Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΉ ΡΡΠΈΠ»Ρ ΠΏΡΠΎΡΠ²Π»ΡΠ΅Ρ ΡΠ΅Π±Ρ Π²ΠΎ Π²ΡΠ΅ΠΉ ΠΊΡΠ°ΡΠ΅, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠ΅ΠΏΠ΅ΡΡ, Π΅ΡΠ»ΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ f ΠΊ ΡΡΠ΅ΠΌ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ f <$> x <*> y <*> z. ΠΡΠ»ΠΈ Π±Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π±ΡΠ»ΠΈ ΠΎΠ±ΡΡΠ½ΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ, ΠΌΡ Π±Ρ Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ f x y z.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Just "johntra" ΠΈ Just "volta" Π² ΠΎΠ΄Π½Ρ ΡΡΡΠΎΠΊΡ, Π½Π°Ρ ΠΎΠ΄ΡΡΡΡΡΡ Π²Π½ΡΡΡΠΈ ΡΡΠ½ΠΊΡΠΎΡΠ° Maybe. Π‘Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π²ΠΏΠΎΠ»Π½Π΅ Π² Π½Π°ΡΠΈΡ ΡΠΈΠ»Π°Ρ !
ghci> (++) <$> Just "johntra" <*>
Just "volta" Just "johntravolta"
ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΡΡΠ°Π²Π½ΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΡΡ ΡΡΡΠΎΠΊΡ ΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ:
ghci> (++) "johntra" "volta"
"johntravolta"
Π§ΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ Ρ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΌ ΡΡΠ½ΠΊΡΠΎΡΠΎΠΌ, ΠΏΡΠΎΡΡΠΎ ΡΠ°Π·Π±ΡΠΎΡΠ°ΠΉΡΠ΅ Π²ΠΎΠΊΡΡΠ³ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ <$> ΠΈ <*>, ΠΈ ΡΡΠ½ΠΊΡΠΈΡ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΡ Π½Π΅ Π·Π΄ΠΎΡΠΎΠ²ΠΎ Π»ΠΈ?
ΠΠΎΠ·Π²ΡΠ°ΡΠΈΠΌΡΡ ΠΊ Π½Π°ΡΠ΅ΠΌΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ (++) <$> Just "Π΄ΠΆΠΎΠ½ΡΡΠ°" <*> Just "Π²ΠΎΠ»ΡΠ°": ΡΠ½Π°ΡΠ°Π»Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ (++), ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ (++) :: [a] β > [a] β> [a], ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Just "Π΄ΠΆΠΎΠ½ΡΡΠ°". ΠΡΠΎ Π΄Π°ΡΡ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ°ΠΊΠΎΠ΅ ΠΆΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ Just ("Π΄ΠΆΠΎΠ½ΡΡΠ°"++), ΠΈΠΌΠ΅ΡΡΠ΅Π΅ ΡΠΈΠΏ Maybe ([Char] β> [Char]). ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° (++) Π±ΡΠ» Β«ΡΡΠ΅Π΄Π΅Π½Β» ΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ a ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΠ»ΡΡ Π² ΡΠΈΠΏ [Char]! Π ΡΠ΅ΠΏΠ΅ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Just ("Π΄ΠΆΠΎΠ½ΡΡΠ°"++) <*> Just "Π²ΠΎΠ»ΡΠ°", ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· Just ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ Ρ Π΅Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Just "Π²ΠΎΠ»ΡΠ°", ΡΡΠΎ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π΄Π°ΡΡ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ β Just "Π΄ΠΆΠΎΠ½ΡΡΠ°Π²ΠΎΠ»ΡΠ°". ΠΡΠ»ΠΈ Π±Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π΄Π²ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π±ΡΠ»ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Nothing, ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ»ΠΎ Π±Ρ Nothing.
Π‘ΠΏΠΈΡΠΊΠΈ
Π‘ΠΏΠΈΡΠΊΠΈ (Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΈΠΏΠ° ΡΠΏΠΈΡΠΊΠ°, []) ΡΠ²Π»ΡΡΡΡΡ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΎΡΠ°ΠΌΠΈ. ΠΠΎΡ ΡΠ°ΠΊ ΡΡΡΠΏΡΠΈΠ·! ΠΠΎΡ ΠΊΠ°ΠΊ [] ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° Applicative:
instance Applicative [] where
pure x = [x]
fs <*> xs = [f x | f <β fs, x <β xs]