main = do
line <β fmap reverse getLine
putStrLn $ "ΠΡ ΡΠΊΠ°Π·Π°Π»ΠΈ " ++ line ++ " Π½Π°ΠΎΠ±ΠΎΡΠΎΡ!"
putStrLn $ "ΠΠ°, Π²Ρ ΡΠΎΡΠ½ΠΎ ΡΠΊΠ°Π·Π°Π»ΠΈ " ++ line ++ " Π½Π°ΠΎΠ±ΠΎΡΠΎΡ!"
Π’Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ Just "ΡΡΡ" Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ fmap reverse, ΠΏΠΎΠ»ΡΡΠ°Ρ Just "ΡΡΡ", ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΠΈ ΡΡΠ½ΠΊΡΠΈΡ getLine Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ fmap reverse. Π€ΡΠ½ΠΊΡΠΈΡ getLine β ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ IO String, ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π΅Π³ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ reverse Π΄Π°ΡΡ Π½Π°ΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠΉΠ΄Π΅Ρ Π² ΡΠ΅Π°Π»ΡΠ½ΡΠΉ ΠΌΠΈΡ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡ ΡΡΡΠΎΠΊΡ, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΡ reverse ΠΊ ΡΠ²ΠΎΠ΅ΠΌΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ. Π’Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π²Π½ΡΡΡΠΈ ΠΊΠΎΡΠΎΠ±ΠΊΠΈ Maybe, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π²Π½ΡΡΡΠΈ ΠΊΠΎΡΠΎΠ±ΠΊΠΈ IO, Π½ΠΎ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠΉΡΠΈ Π² ΡΠ΅Π°Π»ΡΠ½ΡΠΉ ΠΌΠΈΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΡΠΎ-Π»ΠΈΠ±ΠΎ. ΠΠ°ΡΠ΅ΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΊ ΠΈΠΌΠ΅Π½ΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π·Π°ΠΏΠΈΡΡ <β, ΠΈΠΌΡ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠ°ΠΆΠ°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΡΠΆΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½Π° ΡΡΠ½ΠΊΡΠΈΡ reverse.
ΠΠ΅ΠΉΡΡΠ²ΠΈΠ΅ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° fmap (++"!") getLine Π²Π΅Π΄ΡΡ ΡΠ΅Π±Ρ Π² ΡΠΎΡΠ½ΠΎΡΡΠΈ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡ getLine, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΊ Π΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π²ΡΠ΅Π³Π΄Π° Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ ΡΡΡΠΎΠΊΠ° "!" Π² ΠΊΠΎΠ½Π΅Ρ!
ΠΡΠ»ΠΈ Π±Ρ ΡΡΠ½ΠΊΡΠΈΡ fmap ΡΠ°Π±ΠΎΡΠ°Π»Π° ΡΠΎΠ»ΡΠΊΠΎ Ρ ΡΠΈΠΏΠΎΠΌ IO, ΠΎΠ½Π° ΠΈΠΌΠ΅Π»Π° Π±Ρ ΡΠΈΠΏ fmap :: (a β> b) β> IO a β> IO b. Π€ΡΠ½ΠΊΡΠΈΡ fmap ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΎΠ²ΠΎΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°, ΠΏΠΎΡ ΠΎΠΆΠ΅Π΅ Π½Π° ΡΡΠ°ΡΠΎΠ΅, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΊ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅ΠΌΡΡΡ Π² Π½ΡΠΌ, ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ.
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Ρ ΡΠ²ΡΠ·ΡΠ²Π°Π΅ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π»ΠΈΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΊ Π½Π΅ΠΌΡ ΡΡΠ½ΠΊΡΠΈΡ, Π° Π·Π°ΡΠ΅ΠΌ Π΄Π°ΡΡΠ΅ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΌΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ Π΄ΡΡΠ³ΠΎΠ΅ ΠΈΠΌΡ, β Π² ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎΠ΄ΡΠΌΠ°ΠΉΡΠ΅ Π½Π°Π΄ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ fmap. ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΊ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ Π΄Π°Π½Π½ΡΠΌ Π²Π½ΡΡΡΠΈ ΡΡΠ½ΠΊΡΠΎΡΠ°, ΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΡΠ²ΠΎΡ ΡΡΠ½ΠΊΡΠΈΡ Π½Π° Π²Π΅ΡΡ Π½Π΅ΠΌ ΡΡΠΎΠ²Π½Π΅, ΡΠΎΠ·Π΄Π°ΡΡ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ»ΠΈ, Π² ΠΈΠ΄Π΅Π°Π»Π΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ:
import Data.Char
import Data.List
main = do
line <β fmap (intersperse '-' . reverse . map toUpper) getLine
putStrLn line
ΠΠΎΡ ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄ΡΡ, Π΅ΡΠ»ΠΈ ΠΌΡ ΡΠΎΡ ΡΠ°Π½ΠΈΠΌ ΡΡΠΎΡ ΠΊΠΎΠ΄ Π² ΡΠ°ΠΉΠ»Π΅ fmapping_io.hs, ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌ, Π·Π°ΠΏΡΡΡΠΈΠΌ ΠΈ Π²Π²Π΅Π΄ΡΠΌ "ΠΠΉ, ΠΏΡΠΈΠ²Π΅Ρ":
$ ./fmapping_io
ΠΠΉ, ΠΏΡΠΈΠ²Π΅Ρ
Π’-Π-Π-Π-Π -Π- -,-Π-Π
ΠΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ intersperse '-' . reverse . map toUpper Π±Π΅ΡΡΡ ΡΡΡΠΎΠΊΡ, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ Π΅Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ toUpper, ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ reverse ΠΊ ΡΡΠΎΠΌΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ ΠΊ Π½Π΅ΠΌΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ intersperse '-'. ΠΡΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΊΡΠ°ΡΠΈΠ²ΡΠΉ ΡΠΏΠΎΡΠΎΠ± Π·Π°ΠΏΠΈΡΠΈ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π°:
(\xs β> intersperse '-' (reverse (map toUpper xs)))
Π€ΡΠ½ΠΊΡΠΈΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ²
ΠΡΡΠ³ΠΈΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° Functor, Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΠΌΡ Π²ΡΡ Π²ΡΠ΅ΠΌΡ ΠΈΠΌΠ΅Π»ΠΈ Π΄Π΅Π»ΠΎ, ΡΠ²Π»ΡΠ΅ΡΡΡ (β>) r. Π‘ΡΠΎΠΉΡΠ΅!.. Π§ΡΠΎ, ΡΡΡΡ Π²ΠΎΠ·ΡΠΌΠΈ, ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ (β>) r? Π’ΠΈΠΏ ΡΡΠ½ΠΊΡΠΈΠΈ r β> a ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°Π½ Π² Π²ΠΈΠ΄Π΅ (β>) r a, ΡΠ°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΠΈΡΠ°ΡΡ 2 + 3 Π² Π²ΠΈΠ΄Π΅ (+) 2 3. ΠΠΎΠ³Π΄Π° ΠΌΡ Π²ΠΎΡΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ Π΅Π³ΠΎ ΠΊΠ°ΠΊ (β>) r a, ΡΠΎ (β>) ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π² Π΄ΡΡΠ³ΠΎΠΌ ΡΠ²Π΅ΡΠ΅. ΠΡΠΎ ΠΏΡΠΎΡΡΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΈΠΏΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π΄Π²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΠΈΠΏΠ°, ΠΊΠ°ΠΊ ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Either.
ΠΠΎ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΈΠΏΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π² ΡΠΎΡΠ½ΠΎΡΡΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΈΠΏΠ°, ΡΡΠΎΠ±Ρ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° Functor. ΠΠΎΡ ΠΏΠΎΡΠ΅ΠΌΡ Π½Π΅Π»ΡΠ·Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ (β>) ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° Functor; ΠΎΠ΄Π½Π°ΠΊΠΎ, Π΅ΡΠ»ΠΈ ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ Π΅Π³ΠΎ Π΄ΠΎ (β>) r, ΡΡΠΎ Π½Π΅ ΡΠΎΡΡΠ°Π²ΠΈΡ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ. ΠΡΠ»ΠΈ Π±Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ» ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ ΡΠΈΠΏΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ β ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΡΠΎΠΌΡ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ +, Π²ΡΠΏΠΎΠ»Π½ΠΈΠ² (2+), ΡΡΠΎ ΡΠ°Π²Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎ (+) 2, β Π²Ρ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π·Π°ΠΏΠΈΡΠ°ΡΡ (β>) r ΠΊΠ°ΠΊ (r β>).
ΠΠ°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΡΡΡΠΏΠ°ΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ²? ΠΠ°Π²Π°ΠΉΡΠ΅ Π²Π·Π³Π»ΡΠ½Π΅ΠΌ Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΠΌΠΎΠ΄ΡΠ»Π΅ Control.Monad.Instances.
instance Functor ((β>) r) where
fmap f g = (\x β> f (g x))
Π‘Π½Π°ΡΠ°Π»Π° ΠΏΠΎΠ΄ΡΠΌΠ°Π΅ΠΌ Π½Π°Π΄ ΡΠΈΠΏΠΎΠΌ ΠΌΠ΅ΡΠΎΠ΄Π° fmap:
fmap :: (a β> b) β> f a β> f b
ΠΠ°Π»Π΅Π΅ ΠΌΡΡΠ»Π΅Π½Π½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° f, ΡΠ²Π»ΡΡΡΠ΅Π³ΠΎΡΡ ΡΠΎΠ»ΡΡ, ΠΊΠΎΡΠΎΡΡΡ ΠΈΠ³ΡΠ°Π΅Ρ Π½Π°Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΡΡΠ½ΠΊΡΠΎΡΠ°, Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ (β>) r. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π½Π°ΠΌ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡ fmap Π΄ΠΎΠ»ΠΆΠ½Π° Π²Π΅ΡΡΠΈ ΡΠ΅Π±Ρ Π² ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°. ΠΠΎΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ:
fmap :: (a β> b) β> ((β>) r a) β> ((β>) r b)
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°ΡΡ ΡΠΈΠΏΡ (β>) r a ΠΈ (β>) r b Π² ΠΈΠ½ΡΠΈΠΊΡΠ½ΠΎΠΌ Π²ΠΈΠ΄Π΅, ΡΠΎ Π΅ΡΡΡ r β> a ΠΈ r β> b, ΠΊΠ°ΠΊ ΠΌΡ ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΠΎΡΡΡΠΏΠ°Π΅ΠΌ Ρ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ:
fmap :: (a β> b) β> (r β> a) β> (r β> b)
Π₯ΠΎΡΠΎΡΠΎ. ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄ΡΡΠ³ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΡ, ΡΠ°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Maybe Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΡΠΈΠΏ Maybe, Π° ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ β ΡΠΏΠΈΡΠΎΠΊ. Π ΡΡΠΌ Π³ΠΎΠ²ΠΎΡΠΈΡ Π½Π°ΠΌ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΡΠΈΠΏ? ΠΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΠΎΠ½ Π±Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· a Π² b ΠΈ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· r Π² a ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· r Π² b. ΠΠ°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ Π»ΠΈ ΡΡΠΎ Π²Π°ΠΌ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ? ΠΠ°, ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ!.. ΠΡ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌ Π²ΡΡ ΠΎΠ΄ r β> a ΠΊΠΎ Π²Ρ ΠΎΠ΄Ρ a β> b, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ r β> b, ΡΠ΅ΠΌ Π² ΡΠΎΡΠ½ΠΎΡΡΠΈ ΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΠΎΡ Π΅ΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠΏΠΎΡΠΎΠ± Π·Π°ΠΏΠΈΡΠΈ ΡΡΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°:
instance Functor ((β>) r) where
fmap = (.)
ΠΠΎΠ΄ Π½Π°Π³Π»ΡΠ΄Π½ΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ fmap ΠΊ ΡΡΠ½ΠΊΡΠΈΡΠΌ β ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ.
Π ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠΉΡΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ Control.Monad.Instances, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ, Π³Π΄Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ Π΄Π°Π½Π½ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ, Π° Π·Π°ΡΠ΅ΠΌ Π·Π°Π³ΡΡΠ·ΠΈΡΠ΅ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΈ ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΠΏΠΎΠΈΠ³ΡΠ°ΡΡ Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΉ:
ghci> :t fmap (*3) (+100)
fmap (*3) (+100) :: (Num a) => a β> a
ghci> fmap (*3) (+100) 1
303
ghci> (*3) `fmap` (+100) $ 1
303
ghci> (*3) . (+100) $ 1
303
ghci> fmap (show . (*3)) (*100) 1
"300"
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΠ·ΡΠ²Π°ΡΡ fmap ΠΊΠ°ΠΊ ΠΈΠ½ΡΠΈΠΊΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΡΡΠΎΠ±Ρ ΡΡ ΠΎΠ΄ΡΡΠ²ΠΎ Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ . Π±ΡΠ»ΠΎ ΡΠ²Π½ΡΠΌ. ΠΠΎ Π²ΡΠΎΡΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ Π²Π²ΠΎΠ΄Π° ΠΌΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌ (+100) Ρ ΠΏΠΎΠΌΠΎΡΡΡ (*3), ΡΡΠΎ Π΄Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠΌΠ΅Ρ Π²Π²ΠΎΠ΄, ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡ ΠΊ Π½Π΅ΠΌΡ (+100), Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡ ΠΊ ΡΡΠΎΠΌΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ (*3). ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ 1.
ΠΠ°ΠΊ ΠΈ Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΎΡΡ, ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠ³ΡΡ Π²ΠΎΡΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΡΡ ΠΊΠ°ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°ΠΌΠΈ. ΠΠΎΠ³Π΄Π° Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠΎΠ΄Π΅ (+3), ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΠΈ, Π° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΊ ΡΠ΅ΠΌΡ-Π»ΠΈΠ±ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ. ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ fmap (*3) ΠΊ (+100) ΡΠΎΠ·Π΄Π°ΡΡ Π΅ΡΡ ΠΎΠ΄Π½Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ (+100), Π½ΠΎ ΠΏΠ΅ΡΠ΅Π΄ Π²ΠΎΠ·Π²ΡΠ°ΡΠΎΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° ΠΊ ΡΡΠΎΠΌΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½Π° ΡΡΠ½ΠΊΡΠΈΡ (*3).
Π’ΠΎΡ ΡΠ°ΠΊΡ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ fmap ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΏΡΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΊ ΡΡΠ½ΠΊΡΠΈΡΠΌ, Π½Π° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π½Π°ΠΌ ΠΏΠΎΠ»Π΅Π·Π΅Π½, Π½ΠΎ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, ΠΎΠ½ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΈΠ½ΡΠ΅ΡΠ΅Ρ. ΠΡΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅Π½ΡΠ΅Ρ Π½Π°ΡΠ΅ ΡΠΎΠ·Π½Π°Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΠΊΠ°ΠΊ ΡΡΡΠ½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΡΡΡ ΡΠΊΠΎΡΠ΅Π΅ ΠΊΠ°ΠΊ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ, ΡΠ΅ΠΌ ΠΊΠ°ΠΊ ΠΊΠΎΡΠΎΠ±ΠΊΠΈ (IO ΠΈ (β>) r), ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΡΠ½ΠΊΡΠΎΡΠ°ΠΌΠΈ. ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΎΡ ΠΆΠ΅ ΡΠ°ΠΌΡΠΉ ΡΠΈΠΏ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ, Π½ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΡΠΎΠ³ΠΎ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½ΡΠ½ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ.
ΠΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΊ Π·Π°ΠΊΠΎΠ½Π°ΠΌ, ΠΊΠΎΡΠΎΡΡΠΌ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ fmap, Π΄Π°Π²Π°ΠΉΡΠ΅ Π΅ΡΡ ΡΠ°Π· Π·Π°Π΄ΡΠΌΠ°Π΅ΠΌΡΡ ΠΎ ΡΠΈΠΏΠ΅ fmap:
fmap :: (a β> b) β> f a β> f b
ΠΡΠ»ΠΈ ΠΏΠΎΠΌΠ½ΠΈΡΠ΅, Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΠΊΠ°ΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² Π³Π»Π°Π²Π΅ 5 Π½Π°ΡΠ°Π»ΠΎΡΡ Ρ ΡΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ, ΡΡΠΎ Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΡΠ·ΡΠΊΠ΅ Haskell Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ. Π€ΡΠ½ΠΊΡΠΈΡ a β> b β> c Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π±Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΈΠΏΠ° a, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ b β> c, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΈΠΏΠ° b ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° c. ΠΠΎΡ ΠΏΠΎΡΠ΅ΠΌΡ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ Ρ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² (Π΅Ρ ΡΠ°ΡΡΠΈΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅) Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π°ΠΌ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΏΡΠΎΠΏΡΡΡΠΈΠ»ΠΈ (Π΅ΡΠ»ΠΈ ΠΌΡ ΠΎΠΏΡΡΡ Π²ΠΎΡΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ Π±Ρ ΠΎΠ½ΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²). ΠΠΎΡΡΠΎΠΌΡ a β> b β> c ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π² Π²ΠΈΠ΄Π΅ a β> (b β> c), ΡΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠ°ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΌ.
ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π·Π°ΠΏΠΈΡΠ°Π² fmap :: (a β> b) β> (f a β> f b), ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΎΡΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ fmap Π½Π΅ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΎΠ΄Π½Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΎΡΠ° ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΎΡΠ°, Π½ΠΎ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΎΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΏΡΠ΅ΠΆΠ½ΡΡ, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΎΠ½Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΎΡΠ° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΎΡΠ° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°. ΠΠ½Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΡΠΈΠΏΠ° a β> b ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΡΠΈΠΏΠ° f a β> f b. ΠΡΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Β«Π²ΡΡΠ³ΠΈΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈΒ». ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΡΡΡ ΠΈΠ΄Π΅Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ :t Π² GHCi: