Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π˜Π·ΡƒΡ‡Π°ΠΉ Haskell Π²ΠΎ имя Π΄ΠΎΠ±Ρ€Π°!Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 59

Автор ΠœΠΈΡ€Π°Π½ Π›ΠΈΠΏΠΎΠ²Π°Ρ‡Π°

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. Пока Π²Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ всё ΠΊΡ€ΡƒΡ‚ΠΎ! ΠœΡ‹ Π΄Π°ΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΠ³Ρ€Π°Ρ‚ΡŒ с этим: