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

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

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

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: