ghci> :t fmap (*2)
fmap (*2) :: (Num a, Functor f) => f a β> f a
ghci> :t fmap (replicate 3)
fmap (replicate 3) :: (Functor f) => f a β> f [a]
ΠΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ fmap (*2) β ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΎΡ f Π½Π°Π΄ ΡΠΈΡΠ»Π°ΠΌΠΈ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΎΡ Π½Π°Π΄ ΡΠΈΡΠ»Π°ΠΌΠΈ. Π’Π°ΠΊΠΈΠΌ ΡΡΠ½ΠΊΡΠΎΡΠΎΠΌ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠΏΠΈΡΠΎΠΊ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Maybe, Either String ΠΈΠ»ΠΈ ΡΡΠΎ-ΡΠΎ Π΄ΡΡΠ³ΠΎΠ΅. ΠΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ fmap (replicate 3) ΠΏΠΎΠ»ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΎΡ Π½Π°Π΄ Π»ΡΠ±ΡΠΌ ΡΠΈΠΏΠΎΠΌ ΠΈ Π²Π΅ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΎΡ Π½Π°Π΄ ΡΠΏΠΈΡΠΊΠΎΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°. ΠΡΠΎ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π΅ΡΡ ΠΎΡΠ΅Π²ΠΈΠ΄Π½Π΅Π΅, Π΅ΡΠ»ΠΈ ΠΌΡ ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ, ΡΠΊΠ°ΠΆΠ΅ΠΌ, fmap (++"!"), Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠ²ΡΠΆΠ΅ΠΌ Π΅Ρ ΠΊ ΠΈΠΌΠ΅Π½ΠΈ Π² GHCi.
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ fmap Π΄Π²ΠΎΡΠΊΠΎ:
β’ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΎΡΠ°, Π° Π·Π°ΡΠ΅ΠΌ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΎΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ;
β’ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Π²ΡΡΠ³ΠΈΠ²Π°Π΅Ρ Π΅Ρ Π² ΡΡΠ½ΠΊΡΠΎΡ, ΡΠ°ΠΊ ΡΡΠΎΠ±Ρ ΠΎΠ½Π° ΠΎΠΏΠ΅ΡΠΈΡΠΎΠ²Π°Π»Π° Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ².
ΠΠ±Π΅ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ Π²Π΅ΡΠ½Ρ.
Π’ΠΈΠΏ fmap (replicate 3) :: (Functor f) => f a β> f [a] ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π»ΡΠ±ΡΠΌ ΡΡΠ½ΠΊΡΠΎΡΠΎΠΌ. Π§ΡΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½Π° Π±ΡΠ΄Π΅Ρ Π΄Π΅Π»Π°ΡΡ, Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΡΠ½ΠΊΡΠΎΡΠ°. ΠΡΠ»ΠΈ ΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ fmap (replicate 3) ΠΊ ΡΠΏΠΈΡΠΊΡ, Π±ΡΠ΄Π΅Ρ Π²ΡΠ±ΡΠ°Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ fmap Π΄Π»Ρ ΡΠΏΠΈΡΠΊΠ°, ΡΠΎ Π΅ΡΡΡ ΠΏΡΠΎΡΡΠΎ map. ΠΡΠ»ΠΈ ΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ Π΅Ρ ΠΊ Maybe a, ΠΎΠ½Π° ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡ replicate 3 ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π²Π½ΡΡΡΠΈ Just. ΠΡΠ»ΠΈ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π²Π½ΠΎ Nothing, ΡΠΎ ΠΎΠ½ΠΎ ΠΎΡΡΠ°Π½Π΅ΡΡΡ ΡΠ°Π²Π½ΡΠΌ Nothing. ΠΠΎΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ²:
ghci> fmap (replicate 3) [1,2,3,4]
[[1,1,1],[2,2,2],[3,3,3],[4,4,4]]
ghci> fmap (replicate 3) (Just 4)
Just [4,4,4]
ghci> fmap (replicate 3) (Right "Π»Ρ")
Right ["Π»Ρ","Π»Ρ","Π»Ρ"]
ghci> fmap (replicate 3) Nothing
Nothing
ghci> fmap (replicate 3) (Left "ΡΡΡ")
Left "ΡΡΡ"
ΠΠ°ΠΊΠΎΠ½Ρ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ²
ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΎΡΡ ΠΏΡΠΎΡΠ²Π»ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. ΠΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π½Π°Π΄ΡΠΆΠ½ΠΎ Π²Π΅ΡΡΠΈ ΡΠ΅Π±Ρ ΠΊΠ°ΠΊ ΡΡΡΠ½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ. ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ fmap ΠΊ ΡΡΠ½ΠΊΡΠΎΡΡ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΡΡΠ½ΠΊΡΠΎΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ β Π½ΠΈΡΠ΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅. ΠΡΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π² Π·Π°ΠΊΠΎΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ². ΠΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΊΠ»Π°ΡΡΠ° Functor Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΡΡΠΈΠΌ Π΄Π²ΡΠΌ Π·Π°ΠΊΠΎΠ½Π°ΠΌ. Π―Π·ΡΠΊ Haskell Π½Π΅ ΠΏΡΠΈΠ½ΡΠΆΠ΄Π°Π΅Ρ, ΡΡΠΎΠ±Ρ ΡΡΠΈ Π·Π°ΠΊΠΎΠ½Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΈΡ ΡΠ°ΠΌΠΈ, ΠΊΠΎΠ³Π΄Π° ΡΠΎΠ·Π΄Π°ΡΡΠ΅ ΡΡΠ½ΠΊΡΠΎΡ. ΠΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΊΠ»Π°ΡΡΠ° Functor Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΡΠΈ Π·Π°ΠΊΠΎΠ½Ρ.
ΠΠ°ΠΊΠΎΠ½ 1
ΠΠ΅ΡΠ²ΡΠΉ Π·Π°ΠΊΠΎΠ½ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ² Π³Π»Π°ΡΠΈΡ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ id ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΎΡΠ°, ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΎΡΠ°, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΎΡΠ°. Π ΡΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ ΡΡΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ: fmap id = id. ΠΠ½ΡΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ fmap id ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΎΡΠ°, ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ id ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΡΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ id β ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ ΡΠΎΠΆΠ΄Π΅ΡΡΠ²Π°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΎΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ²ΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΡΠΌ. ΠΠ½Π° ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΠΏΠΈΡΠ°Π½Π° Π² Π²ΠΈΠ΄Π΅ \x β> x. ΠΡΠ»ΠΈ Π²ΠΎΡΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΎΡΠ° ΠΊΠ°ΠΊ Π½Π΅ΡΡΠΎ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΎ, ΡΠΎ Π·Π°ΠΊΠΎΠ½ fmap id = id ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΌ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π»ΠΈ ΠΎΠ½ Π΄Π»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ²:
ghci> fmap id (Just 3)
Just 3
ghci> id (Just 3)
Just 3
ghci> fmap id [1..5]
[1,2,3,4,5]
ghci> id [1..5]
[1,2,3,4,5]
ghci> fmap id []
[]
ghci> fmap id Nothing
Nothing
ΠΡΠ»ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΡ fmap, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΡΠΈΠΏΠ° Maybe, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ½ΡΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ²ΡΠΉ Π·Π°ΠΊΠΎΠ½ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ²:
instance Functor Maybe where
fmap f (Just x) = Just (f x)
fmap f Nothing= Nothing
ΠΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΠΌ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ id ΠΈΠ³ΡΠ°Π΅Ρ ΡΠΎΠ»Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° f Π² ΡΡΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΠ°ΠΌ Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ fmap id ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Just x, ΡΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ Just (id x), ΠΈ ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ id ΠΏΡΠΎΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ²ΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ Π²ΡΠ²ΠΎΠ΄, ΡΡΠΎ Just (id x) ΡΠ°Π²Π½ΠΎ Just x. Π’Π΅ΠΏΠ΅ΡΡ Π½Π°ΠΌ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ id ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΈΠΏΠ° Maybe, ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΌΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° Π΄Π°Π½Π½ΡΡ Just, ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
ΠΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ id ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Nothing Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Nothing. ΠΠΎΡΡΠΎΠΌΡ ΠΈΠ· ΡΡΠΈΡ Π΄Π²ΡΡ ΡΠ°Π²Π΅Π½ΡΡΠ² Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ fmap Π½Π°ΠΌ Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π·Π°ΠΊΠΎΠ½ fmap id = id ΡΠΎΠ±Π»ΡΠ΄Π°Π΅ΡΡΡ.
ΠΠ°ΠΊΠΎΠ½ 2
ΠΡΠΎΡΠΎΠΉ Π·Π°ΠΊΠΎΠ½ Π³Π»Π°ΡΠΈΡ, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ Π΄Π²ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊ ΡΡΠ½ΠΊΡΠΎΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π΄Π°Π²Π°ΡΡ ΡΠΎΡ ΠΆΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, ΡΡΠΎ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊ ΡΡΠ½ΠΊΡΠΎΡΡ, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ΠΎΠΉ. Π ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ ΡΡΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ: fmap (f . g) = fmap f . fmap g. ΠΠ»ΠΈ Π΅ΡΠ»ΠΈ Π·Π°ΠΏΠΈΡΠ°ΡΡ ΠΏΠΎ-Π΄ΡΡΠ³ΠΎΠΌΡ, ΡΠΎ Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΎΡΠ° x Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅: fmap (f . g) x = fmap f (fmap g x).
ΠΡΠ»ΠΈ ΠΌΡ Π²ΡΡΠ²ΠΈΠ»ΠΈ, ΡΡΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΈΠΏ ΠΏΠΎΠ΄ΡΠΈΠ½ΡΠ΅ΡΡΡ Π΄Π²ΡΠΌ Π·Π°ΠΊΠΎΠ½Π°ΠΌ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ², Π½Π°Π΄ΠΎ Π½Π°Π΄Π΅ΡΡΡΡΡ, ΡΡΠΎ ΠΎΠ½ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ ΡΠ°ΠΊΠΈΠΌΠΈ ΠΆΠ΅ ΡΡΠ½Π΄Π°ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠΌΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡΠΌΠΈ, ΠΊΠ°ΠΊ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΎΡΡ, ΠΊΠΎΠ³Π΄Π° Π΄Π΅Π»ΠΎ Π΄ΠΎΡ ΠΎΠ΄ΠΈΡ Π΄ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ Π±ΡΡΡ ΡΠ²Π΅ΡΠ΅Π½Ρ, ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΊ Π½Π΅ΠΌΡ ΡΡΠ½ΠΊΡΠΈΡ fmap, Π·Π° ΠΊΡΠ»ΠΈΡΠ°ΠΌΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄ΡΡ, ΠΊΡΠΎΠΌΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΈ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΡΡΡΠ½ΠΎΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π° β ΡΠΎ Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΎΡ.
ΠΠΎΠΆΠ½ΠΎ Π²ΡΡΡΠ½ΠΈΡΡ, ΠΊΠ°ΠΊ Π²ΡΠΎΡΠΎΠΉ Π·Π°ΠΊΠΎΠ½ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΡΠΈΠΏΡ, ΠΏΠΎΡΠΌΠΎΡΡΠ΅Π² Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ fmap Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, Π° Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π² ΠΌΠ΅ΡΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ»ΠΈ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΠΏΠΎΠ΄ΡΠΈΠ½ΡΠ΅ΡΡΡ Π»ΠΈ ΡΠΈΠΏ Maybe ΠΏΠ΅ΡΠ²ΠΎΠΌΡ Π·Π°ΠΊΠΎΠ½Ρ. ΠΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΠΊΠ°ΠΊ Π²ΡΠΎΡΠΎΠΉ Π·Π°ΠΊΠΎΠ½ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ² Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΈΠΏΠ° Maybe, Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ fmap (f . g) ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Nothing, ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Nothing, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π»ΡΠ±ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊ Nothing Π΄Π°ΡΡ Nothing. ΠΡΠ»ΠΈ ΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ fmap f (fmap g Nothing), ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Nothing ΠΏΠΎ ΡΠ΅ΠΌ ΠΆΠ΅ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ.
ΠΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΠΊΠ°ΠΊ Π²ΡΠΎΡΠΎΠΉ Π·Π°ΠΊΠΎΠ½ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΈΠΏΠ° Maybe, ΠΊΠΎΠ³Π΄Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π²Π½ΠΎ Nothing. ΠΠΎ ΡΡΠΎ Π΅ΡΠ»ΠΈ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Just? ΠΠ°Π΄Π½ΠΎ β Π΅ΡΠ»ΠΈ ΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΠΌ fmap (f . g) (Just x), ΠΈΠ· ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π°ΠΌ Π±ΡΠ΄Π΅Ρ Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΡΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΠΊΠ°ΠΊ Just ((f . g) x); Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΡΡ Π±ΡΠ»ΠΎ Π±Ρ Just (f (g x)). ΠΡΠ»ΠΈ ΠΆΠ΅ ΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΠΌ fmap f (fmap g (Just x)), ΡΠΎ ΠΈΠ· ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ fmap g (Just x) β ΡΡΠΎ Just (g x). Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, fmap f (fmap g (Just x)) ΡΠ°Π²Π½ΠΎ fmap f (Just (g x)), Π° ΠΈΠ· ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π°ΠΌ Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΡΡΠΎ ΡΠ°Π²Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎ Just (f (g x)).
ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΌΡΡΠ΅Π½Ρ ΡΡΠΈΠΌ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎΠΌ, Π½Π΅ Π²ΠΎΠ»Π½ΡΠΉΡΠ΅ΡΡ. Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΡΠ΅, ΠΊΠ°ΠΊ ΡΡΡΡΠΎΠ΅Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ. Π§Π°ΡΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠ½ΡΡΠΈΡΠΈΠ²Π½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΠΊΠ°ΠΊ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΡΠΈ Π·Π°ΠΊΠΎΠ½Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠΈΠΏΡ Π΄Π΅ΠΉΡΡΠ²ΡΡΡ ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ ΠΈΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΈΡ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ°Π·Π½ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡΡ ΡΠΈΠΏΠ° β ΠΈ ΡΡΠΌΠ΅Π΅ΡΠ΅ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΉ Π΄ΠΎΠ»Π΅ΠΉ ΡΠ²Π΅ΡΠ΅Π½Π½ΠΎΡΡΠΈ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΡΠΈΠΏ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠ΄ΡΠΈΠ½ΡΠ΅ΡΡΡ ΡΡΠΈΠΌ Π·Π°ΠΊΠΎΠ½Π°ΠΌ.
ΠΠ°ΡΡΡΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠΎΠ½Π°
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ Π½Π° Β«ΠΏΠ°ΡΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠΉΒ» ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΡΠΈΠΏΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° ΡΠΈΠΏΠΎΠ² Functor, Π½ΠΎ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΎΡΠΎΠΌ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π·Π°ΠΊΠΎΠ½Ρ. Π‘ΠΊΠ°ΠΆΠ΅ΠΌ, Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠΈΠΏ:
data CMaybe a = CNothing | CJust Int a deriving (Show)
ΠΡΠΊΠ²Π° C Π·Π΄Π΅ΡΡ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΡΡΡΡΡΠΈΠΊ. ΠΡΠΎ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠΉ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ ΠΏΠΎΡ ΠΎΠΆ Π½Π° ΡΠΈΠΏ Maybe a, ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΡΡ Just ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π΄Π²Π° ΠΏΠΎΠ»Ρ Π²ΠΌΠ΅ΡΡΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ. ΠΠ΅ΡΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅ Π΄Π°Π½Π½ΡΡ CJust Π²ΡΠ΅Π³Π΄Π° ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ Int; ΠΎΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠΎΠ΄Π° ΡΡΡΡΡΠΈΠΊΠΎΠΌ. ΠΡΠΎΡΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ a, ΠΊΠΎΡΠΎΡΡΠΉ Π±Π΅ΡΡΡΡΡ ΠΈΠ· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΠΈΠΏΠ°, ΠΈ Π΅Π³ΠΎ ΡΠΈΠΏ Π±ΡΠ΄Π΅Ρ Π·Π°Π²ΠΈΡΠ΅ΡΡ ΠΎΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Π²ΡΠ±Π΅ΡΠ΅ΠΌ Π΄Π»Ρ CMaybe a. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΡΠ΅ΠΌ Ρ Π½Π°ΡΠΈΠΌ Π½ΠΎΠ²ΡΠΌ ΡΠΈΠΏΠΎΠΌ:
ghci> CNothing
CNothing
ghci> CJust 0 "Ρ Π°-Ρ Π°"
CJust 0 "Ρ Π°-Ρ Π°"
ghci> :t CNothing
CNothing :: CMaybe a
ghci> :t CJust 0 "Ρ Π°-Ρ Π°"
CJust 0 "Ρ Π°-Ρ Π°" :: CMaybe [Char]
ghci> CJust 100 [1,2,3]
CJust 100 [1,2,3]
ΠΡΠ»ΠΈ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π΄Π°Π½Π½ΡΡ CNothing, Π² Π½ΡΠΌ Π½Π΅Ρ ΠΏΠΎΠ»Π΅ΠΉ. ΠΡΠ»ΠΈ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π΄Π°Π½Π½ΡΡ CJust, ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π»ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ, Π° Π²ΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°. ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΡΡΠΎΡ ΡΠΈΠΏ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° Functor, ΡΠ°ΠΊ ΡΡΠΎΠ±Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ fmap, ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ»Π°ΡΡ ΠΊΠΎ Π²ΡΠΎΡΠΎΠΌΡ ΠΏΠΎΠ»Ρ, Π° ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π»ΠΎΡΡ Π½Π° 1:
instance Functor CMaybe where
fmap f CNothing= CNothing
fmap f (CJust counter x) = CJust (counter+1) (f x)
ΠΡΠΎ ΠΎΡΡΠ°ΡΡΠΈ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π΄Π»Ρ ΡΠΈΠΏΠ° Maybe, ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ³Π΄Π° ΡΡΠ½ΠΊΡΠΈΡ fmap ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΡΡΡΡΡ ΠΊΠΎΡΠΎΠ±ΠΊΡ (Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ CJust), ΠΌΡ Π½Π΅ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ ΠΊ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠΌΡ, Π½ΠΎ ΠΈ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΠΌ ΡΡΡΡΡΠΈΠΊ Π½Π° 1. ΠΠΎΠΊΠ° Π²ΡΠΎΠ΄Π΅ Π±Ρ Π²ΡΡ ΠΊΡΡΡΠΎ! ΠΡ Π΄Π°ΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΠ³ΡΠ°ΡΡ Ρ ΡΡΠΈΠΌ: