ΠΠ΄Π½Π°ΠΊΠΎ Π·Π΄Π΅ΡΡ Π΅ΡΡΡ ΠΎΠ΄Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°. ΠΠ°ΠΌΠ΅ΡΠΈΠ»ΠΈ? ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ == Π΄Π»Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Maybe, Π½ΠΎ Ρ Π½Π°Ρ Π½Π΅Ρ ΡΠ²Π΅ΡΠ΅Π½Π½ΠΎΡΡΠΈ, ΡΡΠΎ ΡΠΎ, ΡΡΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΈΠΏ Maybe, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΎ Ρ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ ΠΊΠ»Π°ΡΡΠ° Eq. ΠΠΎΡ ΠΏΠΎΡΠ΅ΠΌΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡΡ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π½Π° ΡΠ»Π΅Π΄ΡΡΡΡΡ:
instance (Eq m) => Eq (Maybe m) where
Just x == Just y = x == y
Nothing == Nothing = True
_ == _ = False
ΠΠ°ΠΌ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ»Π°ΡΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΊΠ»Π°ΡΡΠ° ΠΌΡ ΡΡΠ²Π΅ΡΠΆΠ΄Π°Π΅ΠΌ: Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, ΡΡΠΎΠ±Ρ Π²ΡΠ΅ ΡΠΈΠΏΡ Π²ΠΈΠ΄Π° Maybe m ΠΈΠΌΠ΅Π»ΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ° Eq, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠΈΠΏ m (ΡΠΎΡ, ΡΡΠΎ Ρ ΡΠ°Π½ΠΈΡΡΡ Π² Maybe) ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Eq. Π’Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΏΠΎΡΠΎΠ΄ΠΈΠ» Π±Ρ ΡΠ°ΠΌ ΡΠ·ΡΠΊ Haskell, Π΅ΡΠ»ΠΈ Π±Ρ ΠΌΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²ΠΎΠΉ deriving.
Π Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π² ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° ΠΊΠ»Π°ΡΡ Π² Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠ»Π°ΡΡ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠΎΠΌ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°. ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° ΠΊΠ»Π°ΡΡ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π²ΡΡΠ°Π·ΠΈΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠΌΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΡΡΠ΅Π±ΡΠ΅ΠΌ, ΡΡΠΎΠ±Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠΈΠΏΠ° Maybe ΡΠ°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π»ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ° Eq.
ΠΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ², Π΅ΡΠ»ΠΈ Π²Ρ Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎ ΡΠΈΠΏ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΏΡΠΈ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, a β> a β> Bool), Π° Π²Ρ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π΄Π»Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΡΠΈΠΏΠΎΠ², ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠΈΠΏ-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠΊΠΎΠ±ΠΊΠΈ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠΈΠΏ.
ΠΡΠΈΠΌΠΈΡΠ΅ Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΡΠΈΠΏ, ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π²Ρ ΠΏΡΡΠ°Π΅ΡΠ΅ΡΡ ΡΠΎΠ·Π΄Π°ΡΡ, Π·Π°ΠΌΠ΅Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π² Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ°. ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ a ΠΈΠ· Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΈ class Eq a where Π±ΡΠ΄Π΅Ρ Π·Π°ΠΌΠ΅Π½ΡΠ½ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ ΡΠΈΠΏΠΎΠΌ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°; ΠΏΠΎΠΏΡΡΠ°ΠΉΡΠ΅ΡΡ Π² ΡΠΌΠ΅ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΡΠΈΠΏ ΡΠ°ΠΊΠΆΠ΅ ΠΈ Π² Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ. Π‘ΠΈΠ³Π½Π°ΡΡΡΠ° (==) :: Maybe β> Maybe β> Bool Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΡΠΌΡΡΠ»Π°, Π½ΠΎ ΡΠΈΠ³Π½Π°ΡΡΡΠ° (==) :: (Eq m) => Maybe m β> Maybe m β> Bool ΠΈΠΌΠ΅Π΅Ρ. ΠΠΏΡΠΎΡΠ΅ΠΌ, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ == Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠΈΠΏ (==) :: (Eq a) => a β> a β> Bool Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΌΡ ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅ΠΌ.
Π, ΠΈ Π΅ΡΡ ΠΎΠ΄Π½Π° ΠΊΠ»Π°ΡΡΠ½Π°Ρ ΡΠΈΡΠΊΠ°! ΠΡΠ»ΠΈ Ρ ΠΎΡΠΈΡΠ΅ ΡΠ·Π½Π°ΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ° ΡΠΈΠΏΠΎΠ², Π²ΡΠ·ΠΎΠ²ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ : info Π² GHCi. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΡΠΏΠΎΠ»Π½ΠΈΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ :info Num, Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅, ΠΊΠ°ΠΊΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π² ΡΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ ΡΠΈΠΏΠΎΠ², ΠΈ Π²ΡΠ²Π΅Π΄Π΅ΡΠ΅ ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°ΡΠΈΡ ΠΊΠ»Π°ΡΡΡ ΡΠΈΠΏΠΎΠ². ΠΠΎΠΌΠ°Π½Π΄Π° :info ΡΠ°ΠΊΠΆΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΡΠΈΠΏΠ°ΠΌΠΈ ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°ΠΌΠΈ ΡΠΈΠΏΠΎΠ². ΠΡΠ»ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ :info Maybe, ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ Π²ΡΠ΅ ΠΊΠ»Π°ΡΡΡ ΡΠΈΠΏΠΎΠ², ΠΊ ΠΊΠΎΡΠΎΡΡΠΌ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΡΠΈΠΏ Maybe. ΠΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ:
ghci> :info Maybe
data Maybe a = Nothing | Just a -- Defined in Data.Maybe
instance Eq a => Eq (Maybe a) -- Defined in Data.Maybe
instance Monad Maybe -- Defined in Data.Maybe
instance Functor Maybe -- Defined in Data.Maybe
instance Ord a => Ord (Maybe a) -- Defined in Data.Maybe
instance Read a => Read (Maybe a) -- Defined in GHC.Read
instance Show a => Show (Maybe a) -- Defined in GHC.Show
ΠΠ»Π°ΡΡ ΡΠΈΠΏΠΎΠ² Β«Π΄Π°βΠ½Π΅ΡΒ»
Π ΡΠ·ΡΠΊΠ΅ JavaScript ΠΈ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π΄ΡΡΠ³ΠΈΡ ΡΠ»Π°Π±ΠΎ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ·ΡΠΊΠ°Ρ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ if ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π»ΡΠ±ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠ΅:
if (0) alert("ΠΠ!") else alert("ΠΠΠ’!")
if ("") alert ("ΠΠ!") else alert("ΠΠΠ’!")
if (false) alert("ΠΠ!") else alert("ΠΠΠ’!)
ΠΈ Π²ΡΠ΅ ΠΎΠ½ΠΈ ΠΏΠΎΠΊΠ°ΠΆΡΡ ΠΠΠ’!".
ΠΡΠ»ΠΈ Π²ΡΠ·Π²Π°ΡΡ
if ("Π§Π’Π") alert ("ΠΠ!") else alert("ΠΠΠ’!")
ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ "ΠΠ!", ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠ·ΡΠΊ JavaScript ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ Π½Π΅ΠΏΡΡΡΡΠ΅ ΡΡΡΠΎΠΊΠΈ ΠΊΠ°ΠΊ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈΡΡΠΈΠ½Π½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ ΡΡΡΠΎΠ³ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Bool Π΄Π»Ρ Π±ΡΠ»Π΅Π²ΡΠΊΠΈΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠ·ΡΠΊΠ° Haskell, Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. ΠΡΠΎΡΡΠΎ Π΄Π»Ρ Π·Π°Π±Π°Π²Ρ. ΠΠ°ΡΠ½ΡΠΌ Ρ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ°:
class YesNo a where
yesno :: a β> Bool
ΠΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ. ΠΠ»Π°ΡΡ ΡΠΈΠΏΠΎΠ² YesNo ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅ΡΠΎΠ΄. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΎΠ΄Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ Ρ ΡΠ°Π½ΠΈΡΠ΅Π»Ρ Π½Π΅ΠΊΠΎΠ΅ΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ ΠΈΡΡΠΈΠ½Π½ΠΎΡΡΠΈ; ΡΡΠ½ΠΊΡΠΈΡ Π³ΠΎΠ²ΠΎΡΠΈΡ Π½Π°ΠΌ, ΠΈΡΡΠΈΠ½Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π½Π΅Ρ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΈΠ· ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ a Π² ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠ»Π΅Π΄ΡΠ΅Ρ, ΡΡΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ ΡΠΈΠΏΠΎΠΌ.
Π’Π΅ΠΏΠ΅ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ². ΠΠ»Ρ ΡΠΈΡΠ΅Π», ΡΠ°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Π² ΡΠ·ΡΠΊΠ΅ JavaScript, ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ Π»ΡΠ±ΠΎΠ΅ Π½Π΅Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΡΡΠΈΠ½Π½ΠΎ, Π° Π½ΡΠ»Π΅Π²ΠΎΠ΅ β Π»ΠΎΠΆΠ½ΠΎ.
instance YesNo Int where
yesno 0 = False
yesno _ = True
ΠΡΡΡΡΠ΅ ΡΠΏΠΈΡΠΊΠΈ (ΠΈ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΡΡΡΠΎΠΊΠΈ) ΡΡΠΈΡΠ°ΡΡΡΡ ΠΈΠΌΠ΅ΡΡΠΈΠΌΠΈ Π»ΠΎΠΆΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅; Π½Π΅ ΠΏΡΡΡΡΠ΅ ΡΠΏΠΈΡΠΊΠΈ ΠΈΡΡΠΈΠ½Π½Ρ.
instance YesNo [a] where
yesno [] = False
yesno _ = True
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΌΡ Π·Π°ΠΏΠΈΡΠ°Π»ΠΈ ΡΠΈΠΏ-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ ΡΠΈΠΏΠΎΠΌ, Π½ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π»ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎ ΡΠΈΠΏΠ΅, Ρ ΡΠ°Π½ΠΈΠΌΠΎΠΌ Π² ΡΠΏΠΈΡΠΊΠ΅. Π§ΡΠΎ Π΅ΡΡ? ΠΠΌ-ΠΌβ¦ Π― Π·Π½Π°Ρ, ΡΡΠΎ ΡΠΈΠΏ Bool ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± ΠΈΡΡΠΈΠ½Π½ΠΎΡΡΠΈ ΠΈΠ»ΠΈ Π»ΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΈ ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ ΠΎΠ± ΡΡΠΎΠΌ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π½Π΅Π΄Π²ΡΡΠΌΡΡΠ»Π΅Π½Π½ΠΎ:
instance YesNo Bool where
yesno = id
Π§ΡΠΎ? ΠΠ°ΠΊΠΎΠ΅ id?.. ΠΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΈ Π΅Π³ΠΎ ΠΆΠ΅ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ. ΠΡ Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π·Π°ΠΏΠΈΡΠ°Π»ΠΈ Π±Ρ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅. Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π΄Π»Ρ ΡΠΈΠΏΠ° Maybe:
instance YesNo (Maybe a) where
yesno (Just _) = True
yesno Nothing = False
ΠΠ°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ»Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΡ Π½Π΅ Π΄Π΅Π»Π°Π΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠΌ ΡΠΈΠΏΠ° Maybe. ΠΡ Π³ΠΎΠ²ΠΎΡΠΈΠΌ, ΡΡΠΎ ΠΎΠ½ ΠΈΡΡΠΈΠ½Π΅Π½ Π΄Π»Ρ Π²ΡΠ΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Just ΠΈ Π»ΠΎΠΆΠ΅Π½ Π΄Π»Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Nothing. ΠΠ°ΠΌ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΈΡΠ°ΡΡ (Maybe a) Π²ΠΌΠ΅ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ Maybe, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ, Π΅ΡΠ»ΠΈ ΠΏΠΎΠ΄ΡΠΌΠ°ΡΡ, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Maybe β> Bool, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Maybe β Π½Π΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠΈΠΏ; Π·Π°ΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ Maybe a β> Bool. ΠΡΡΡΠΎ β Π»ΡΠ±ΠΎΠΉ ΡΠΈΠΏ Π²ΠΈΠ΄Π° Maybe <Π½Π΅ΡΡΠΎ> ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΡΡ YesNo Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΡΠΎ Β«Π½Π΅ΡΡΠΎΒ»!
Π Π°Π½Π΅Π΅ ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΡΠΈΠΏ Tree Π΄Π»Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π±ΠΈΠ½Π°ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΠΎΠ³ΠΎ Π΄Π΅ΡΠ΅Π²Π°. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΏΡΡΡΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΎΠΌ Π»ΠΎΠΆΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π° Π½Π΅ ΠΏΡΡΡΠΎΠ΅ β ΠΈΡΡΠΈΠ½Π½ΠΎΠ³ΠΎ.
instance YesNo (Tree a) where
yesno EmptyTree = False
yesno _ = True
ΠΡΡΡ Π»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈ ΠΈΡΡΠΈΠ½Π½ΠΎΡΡΠΈ ΠΈ Π»ΠΎΠΆΠ½ΠΎΡΡΠΈ Ρ ΡΠ²Π΅ΡΠΎΠ² ΡΠ²Π΅ΡΠΎΡΠΎΡΠ°? ΠΠΎΠ½Π΅ΡΠ½ΠΎ. ΠΡΠ»ΠΈ ΡΠ²Π΅Ρ ΠΊΡΠ°ΡΠ½ΡΠΉ, Π²Ρ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΠ΅ΡΡ. ΠΡΠ»ΠΈ Π·Π΅Π»ΡΠ½ΡΠΉ β ΠΈΠ΄ΡΡΠ΅. ΠΡ Π° Π΅ΡΠ»ΠΈ ΠΆΡΠ»ΡΡΠΉ? ΠΡ, Ρ ΠΎΠ±ΡΡΠ½ΠΎ Π±Π΅Π³Ρ Π½Π° ΠΆΡΠ»ΡΡΠΉ: ΠΆΠΈΡΡ Π½Π΅ ΠΌΠΎΠ³Ρ Π±Π΅Π· Π°Π΄ΡΠ΅Π½Π°Π»ΠΈΠ½Π°!
instance YesNo TrafficLight where
yesno Red = False
yesno _ = True
ΠΡ ΡΡΠΎ ΠΆ, ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ², Π° ΡΠ΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠΈΠ³ΡΠ°Π΅ΠΌ Ρ Π½ΠΈΠΌΠΈ:
ghci> yesno $ length []
False
ghci> yesno "Ρ Π°-Ρ Π°"
True
ghci> yesno ""
False
ghci> yesno $ Just 0
True
ghci> yesno True
True
ghci> yesno EmptyTree
False
ghci> yesno []
False
ghci> yesno [0,0,0]
True
ghci> :t yesno
yesno :: (YesNo a) => a β> Bool
Π’Π°-Π°ΠΊ, ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. Π’Π΅ΠΏΠ΅ΡΡ ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΠΊΠ°ΠΊ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ if, Π½ΠΎ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΠΈΠΏΠΎΠ², Π΄Π»Ρ ΠΊΠΎΡΠΎΡΡΡ Π΅ΡΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° YesNo:
yesnoIf :: (YesNo y) => y β> a β> a β> a
yesnoIf yesnoVal yesResult noResult =
if yesno yesnoVal
then yesResult
else noResult
ΠΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ. Π€ΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈΡΡΠΈΠ½Π½ΠΎΡΡΠΈ ΠΈ Π΄Π²Π° Π΄ΡΡΠ³ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°. ΠΡΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΡΡΠΈΠ½Π½ΠΎ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ; Π΅ΡΠ»ΠΈ Π½Π΅Ρ β Π²ΡΠΎΡΠΎΠΉ.
ghci> yesnoIf [] "ΠΠ!" "ΠΠΠ’!"
"ΠΠΠ’!"
ghci> yesnoIf [2,3,4] "ΠΠ!" "ΠΠΠ’!"
"ΠΠ!"
ghci> yesnoIf True "ΠΠ!" "ΠΠΠ’!"
"ΠΠ!"
ghci> yesnoIf (Just 500) "ΠΠ!" "ΠΠΠ’!"
"ΠΠ!"
ghci> yesnoIf Nothing "ΠΠ!" ΠΠΠ’!"
ΠΠΠ’!"
ΠΠ»Π°ΡΡ ΡΠΈΠΏΠΎΠ² Functor
ΠΡ ΡΠΆΠ΅ Π²ΡΡΡΠ΅ΡΠ°Π»ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΊΠ»Π°ΡΡΠΎΠ² ΡΠΈΠΏΠΎΠ² ΠΈΠ· ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. ΠΠ·Π½Π°ΠΊΠΎΠΌΠΈΠ»ΠΈΡΡ Ρ ΠΊΠ»Π°ΡΡΠΎΠΌ Ord, ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΠΌ Π΄Π»Ρ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠΈΡΡ. ΠΠ΄ΠΎΠ²ΠΎΠ»Ρ Π½Π°Π±Π°Π»ΠΎΠ²Π°Π»ΠΈΡΡ Ρ ΠΊΠ»Π°ΡΡΠΎΠΌ Eq, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΠΌ Π΄Π»Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Π½Π° ΡΠ°Π²Π΅Π½ΡΡΠ²ΠΎ. ΠΠ·ΡΡΠΈΠ»ΠΈ ΠΊΠ»Π°ΡΡ Show, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ ΡΠΈΠΏΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ Π² Π²ΠΈΠ΄Π΅ ΡΡΡΠΎΠΊ. ΠΠ°Ρ Π΄ΠΎΠ±ΡΡΠΉ Π΄ΡΡΠ³ ΠΊΠ»Π°ΡΡ Read ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΡΡΡΠΎΠΊΡ Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ°. ΠΡ Π° ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΡΠΈΡΡΡΠΏΠΈΠΌ ΠΊ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ° ΡΠΈΠΏΠΎΠ² Functor, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΠΎΠ³ΠΎ Π΄Π»Ρ ΡΠΈΠΏΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½Ρ Π΄ΡΡΠ³ Π² Π΄ΡΡΠ³Π°.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² ΡΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ Π²Ρ ΠΏΠΎΠ΄ΡΠΌΠ°Π»ΠΈ ΠΎ ΡΠΏΠΈΡΠΊΠ°Ρ : Π²Π΅Π΄Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠΎΠ² β ΡΡΠΎ ΠΎΡΠ΅Π½Ρ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ½Π½Π°Ρ ΠΈΠ΄ΠΈΠΎΠΌΠ° Π² ΡΠ·ΡΠΊΠ΅ Haskell. Π Π²Ρ ΠΏΡΠ°Π²Ρ: ΡΠΏΠΈΡΠΊΠΎΠ²ΡΠΉ ΡΠΈΠΏ ΠΈΠΌΠ΅Π΅Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ° Functor.
ΠΠ΅Ρ Π»ΡΡΡΠ΅Π³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π° ΠΈΠ·ΡΡΠΈΡΡ ΠΊΠ»Π°ΡΡ ΡΠΈΠΏΠΎΠ² Functor, ΡΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΠΊΠ°ΠΊ ΠΎΠ½ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½. ΠΠΎΡ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ:
fmap :: (a -> b) -> f a -> f b
ΠΡΠ°ΠΊ, ΡΡΠΎ Ρ Π½Π°Ρ ΠΈΠΌΠ΅Π΅ΡΡΡ? ΠΠ»Π°ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΎΠ΄Π½Ρ ΡΡΠ½ΠΊΡΠΈΡ fmap ΠΈ Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄Π»Ρ Π½Π΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. Π’ΠΈΠΏ ΡΡΠ½ΠΊΡΠΈΠΈ fmap Π²Π΅ΡΡΠΌΠ° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½. ΠΠΎ Π²ΡΠ΅Ρ Π²ΡΡΠ΅ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΡΠΈΠΏΠΎΠ² ΡΠΈΠΏ-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, ΠΈΠ³ΡΠ°Π²ΡΠΈΠΉ ΡΠΎΠ»Ρ ΡΠΈΠΏΠ° Π² ΠΊΠ»Π°ΡΡΠ΅, Π±ΡΠ» Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ a Π² ΡΠΈΠ³Π½Π°ΡΡΡΠ΅ (==) :: (Eq a) => a β> a β> Bool. ΠΠΎ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΈΠΏ-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ f Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° (Π½Π΅Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Int, Bool ΠΈΠ»ΠΈ Maybe String); Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ β ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΈΠΏΠΎΠ², ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠΈΠΉ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ. (ΠΠ°ΠΏΠΎΠΌΠ½Ρ: Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Maybe Int ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ ΡΠΈΠΏΠΎΠΌ, Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Maybe β ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΈΠΏΠΎΠ² Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ.) ΠΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ fmap ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π² Π΄ΡΡΠ³ΠΎΠΉ ΠΈ ΡΡΠ½ΠΊΡΠΎΡ, ΠΏΡΠΈΠΌΠ΅Π½ΡΠ½Π½ΡΠΉ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡ ΡΠΈΠΏΡ, ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΎΡ, ΠΏΡΠΈΠΌΠ΅Π½ΡΠ½Π½ΡΠΉ ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ ΡΠΈΠΏΡ.