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

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

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

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово newtype ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ для оборачивания ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² Π² Π½ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ – Π² основном Ρ‡Ρ‚ΠΎΠ±Ρ‹ для Π½ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ экзСмпляры Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… классов Ρ‚ΠΈΠΏΠΎΠ². Когда ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово newtype для оборачивания ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹ΠΉ Π½Π°ΠΌΠΈ Ρ‚ΠΈΠΏ ΠΎΡ‚Π΄Π΅Π»Ρ‘Π½ ΠΎΡ‚ исходного. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΌΡ‹ опрСдСляСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ newtype:

newtype CharList = CharList { getCharList :: [Char] }

НСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ++, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° CharList ΠΈ список Ρ‚ΠΈΠΏΠ° [Char]. НСльзя Π΄Π°ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ++, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π΄Π²Π° значСния Ρ‚ΠΈΠΏΠ° CharList, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ++ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ со списками, Π° Ρ‚ΠΈΠΏ CharList Π½Π΅ являСтся списком, хотя ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ CharList содСрТит список. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²Π° значСния Ρ‚ΠΈΠΏΠ° CharList Π² списки, ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΈΡ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ++, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ΅Π΅ΡΡ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² CharList.

Когда Π² Π½Π°ΡˆΠΈΡ… ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… Ρ‚ΠΈΠΏΠ° newtype ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ синтаксис записСй с ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ полями, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для прСобразования ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΈ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ – Π° ΠΈΠΌΠ΅Π½Π½ΠΎ конструктор Π΄Π°Π½Π½Ρ‹Ρ… нашСго Ρ‚ΠΈΠΏΠ° newtype ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для извлСчСния значСния ΠΈΠ· Π΅Π³ΠΎ поля. Для Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Ρ‚Π°ΠΊΠΆΠ΅ автоматичСски Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ экзСмпляры классов Ρ‚ΠΈΠΏΠΎΠ², для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ экзСмпляры исходного Ρ‚ΠΈΠΏΠ°, поэтому Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡ… ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово deriving) Π»ΠΈΠ±ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

На Π΄Π΅Π»Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ newtype ΠΊΠ°ΠΊ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ data, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΠ΄Π½ΠΈΠΌ конструктором Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΠ»Π΅ΠΌ. Если Π²Ρ‹ ΠΏΠΎΠΉΠΌΠ°Π΅Ρ‚Π΅ сСбя Π½Π° написании Ρ‚Π°ΠΊΠΎΠ³ΠΎ объявлСния, рассмотритС использованиС newtype.

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово data ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ для создания Π²Π°ΡˆΠΈΡ… собствСнных Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…. Ими Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²Π»Π΅Ρ‡ΡŒΡΡ Π½Π΅ Π½Π° ΡˆΡƒΡ‚ΠΊΡƒ. Они ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ конструкторов ΠΈ ΠΏΠΎΠ»Π΅ΠΉ, сколько Π²Ρ‹ ΠΏΠΎΠΆΠ΅Π»Π°Π΅Ρ‚Π΅, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ любого алгСбраичСского Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… – всСго, начиная со списков ΠΈ Maybe-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΈ заканчивая Π΄Π΅Ρ€Π΅Π²ΡŒΡΠΌΠΈ.

ΠŸΠΎΠ΄Π²Π΅Π΄Ρ‘ΠΌ ΠΈΡ‚ΠΎΠ³ Π²Ρ‹ΡˆΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

β€’ Π΅ΡΠ»ΠΈ Π²Ρ‹ просто Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваши сигнатуры Ρ‚ΠΈΠΏΠΎΠ² выглядСли понятнСС ΠΈ Π±Ρ‹Π»ΠΈ Π±ΠΎΠ»Π΅Π΅ наглядными, Π²Π°ΠΌ, вСроятно, Π½ΡƒΠΆΠ½Ρ‹ синонимы Ρ‚ΠΈΠΏΠΎΠ²;

β€’ Π΅ΡΠ»ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Π·ΡΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ ΠΈ ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΅Π³ΠΎ Π² Π½ΠΎΠ²Ρ‹ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ для Π½Π΅Π³ΠΎ экзСмпляр класса Ρ‚ΠΈΠΏΠΎΠ², скорСС всСго, Π²Π°ΠΌ пригодится newtype;

β€’ Π΅ΡΠ»ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½ΠΎΠ²ΠΎΠ΅, Π΅ΡΡ‚ΡŒ шанс, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово data.

Π’ ΠΎΠ±Ρ‰ΠΈΡ… Ρ‡Π΅Ρ€Ρ‚Π°Ρ… ΠΎ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π°Ρ…

ΠšΠ»Π°ΡΡΡ‹ Ρ‚ΠΈΠΏΠΎΠ² Π² языкС Haskell ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для прСдставлСния интСрфСйса ΠΊ Ρ‚ΠΈΠΏΠ°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ Π½Π΅ΠΊΠΈΠΌ схоТим ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ. ΠœΡ‹ Π½Π°Ρ‡Π°Π»ΠΈ с простых классов Ρ‚ΠΈΠΏΠΎΠ² Π²Ρ€ΠΎΠ΄Π΅ класса Eq, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ для Ρ‚ΠΈΠΏΠΎΠ², значСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ, ΠΈ класса Ord – для сущностСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΡ‚ΡŒ. Π—Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΡˆΠ»ΠΈ ΠΊ Π±ΠΎΠ»Π΅Π΅ интСрСсным классам Ρ‚ΠΈΠΏΠΎΠ², Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ классы Functor ΠΈ Applicative.



Боздавая Ρ‚ΠΈΠΏ, ΠΌΡ‹ Π΄ΡƒΠΌΠ°Π΅ΠΌ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ повСдСния ΠΎΠ½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ (ΠΊΠ°ΠΊ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ), Π° Π·Π°Ρ‚Π΅ΠΌ Ρ€Π΅ΡˆΠ°Π΅ΠΌ, экзСмпляры ΠΊΠ°ΠΊΠΈΡ… классов Ρ‚ΠΈΠΏΠΎΠ² для Π½Π΅Π³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΌ Π½Π°ΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ. Если Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ значСния нашСго Ρ‚ΠΈΠΏΠ° Π±Ρ‹Π»ΠΈ сравниваСмыми, ΠΌΡ‹ опрСдСляСм для нашСго Ρ‚ΠΈΠΏΠ° экзСмпляр класса Eq. Если ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ наш Ρ‚ΠΈΠΏ являСтся Ρ‡Π΅ΠΌ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π° – опрСдСляСм для Π½Π΅Π³ΠΎ экзСмпляр класса Functor, ΠΈ Ρ‚. Π΄.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ * – это функция, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° числа ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠ°Π΅Ρ‚ ΠΈΡ…. Если ΠΌΡ‹ ΡƒΠΌΠ½ΠΎΠΆΠΈΠΌ ΠΊΠ°ΠΊΠΎΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ число Π½Π° 1, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ всСгда Ρ€Π°Π²Π΅Π½ этому числу. НСваТно, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Π»ΠΈ ΠΌΡ‹ 1 * x ΠΈΠ»ΠΈ x * 1 – Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ всСгда Ρ€Π°Π²Π΅Π½ x. Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ++ – это функция, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π΅ сущности ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ. Но вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠ°Ρ‚ΡŒ числа, ΠΎΠ½Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° списка ΠΈ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡ…. И Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ *, ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ измСняСт Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ использовании с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ ++. Π­Ρ‚ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ являСтся пустой список: [].

ghci> 4 * 1

4

ghci> 1 * 9

9

ghci> [1,2,3] ++ []

[1,2,3]

ghci> [] ++ [0.5, 2.5]

[0.5,2.5]

ΠŸΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ * вмСстС с 1 ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ++ наряду с [] Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‰ΠΈΠ΅ свойства:

β€’ Ρ„ункция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°;

β€’ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ;

β€’ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ измСняСт Π΄Ρ€ΡƒΠ³ΠΈΠ΅ значСния, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ с Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ.

Π•ΡΡ‚ΡŒ ΠΈ Π΅Ρ‰Ρ‘ Π½Π΅Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‰Π΅Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя этими опСрациями, хотя это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, ΠΊΠ°ΠΊ наши ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ наблюдСния. Когда Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ ΠΈ Π±ΠΎΠ»Π΅Π΅ значСния ΠΈ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для прСвращСния ΠΈΡ… Π² ΠΎΠ΄ΠΈΠ½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Ρ‚ΠΎ порядок, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ примСняСм Π±ΠΈΠ½Π°Ρ€Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊ значСниям, Π½Π΅Π²Π°ΠΆΠ΅Π½. НапримСр, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Π»ΠΈ ΠΌΡ‹ (3 * 4) * 5 ΠΈΠ»ΠΈ 3 * (4 * 5), Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ 60. Π’ΠΎ ΠΆΠ΅ справСдливо ΠΈ для ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ++:

ghci> (3 * 2) * (8 * 5)

240

ghci> 3 * (2 * (8 * 5))

240

ghci> "ой" ++ ("лю" ++ "ли")

"ойлюли"

ghci> ("ой" ++ "лю") ++ "ли"

"ойлюли"

ΠœΡ‹ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌ это свойство Π°ΡΡΠΎΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒΡŽ. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ * ассоциативСн, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ++ Ρ‚ΠΎΠΆΠ΅. Однако ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ –, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ ассоциативСн, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ выраТСния (5 – 3) – 4 ΠΈ 5 – (3 – 4) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.

Зная ΠΎΠ± этих свойствах, ΠΌΡ‹ Π½Π°ΠΊΠΎΠ½Π΅Ρ†-Ρ‚ΠΎ Π½Π°Ρ‚ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ Π½Π° ΠΌΠΎΠ½ΠΎΠΈΠ΄Ρ‹!

Класс Ρ‚ΠΈΠΏΠΎΠ² Monoid

Моноид состоит ΠΈΠ· ассоциативной Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ значСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ дСйствуСт ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΠΈΡ†Π° (Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠ΅ ΠΈΠ»ΠΈ Π½Π΅ΠΉΡ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅) ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Когда Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ дСйствуСт ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΠΈΡ†Π° ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ с Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΈ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ всСгда Ρ€Π°Π²Π΅Π½ этому Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1 являСтся Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ *, Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ [] являСтся Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ ++. Π’ ΠΌΠΈΡ€Π΅ языка Haskell Π΅ΡΡ‚ΡŒ мноТСство Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΎΠ½ΠΎΠΈΠ΄ΠΎΠ², поэтому сущСствуСт Ρ†Π΅Π»Ρ‹ΠΉ класс Ρ‚ΠΈΠΏΠΎΠ² Monoid. Он ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠ½ΠΎΠΈΠ΄Ρ‹. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ этот класс Ρ‚ΠΈΠΏΠΎΠ²:

class Monoid m where

   mempty :: m

   mappend :: m –> m –> m mconcat :: [m] –> m

   mconcat = foldr mappend mempty

Класс Ρ‚ΠΈΠΏΠΎΠ² Monoid ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Data.Monoid. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΊ слСдуСт с Π½ΠΈΠΌ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ.



ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, Π½Π°ΠΌ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ экзСмпляры класса Monoid ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ m Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса Ρ‚ΠΈΠΏΠΎΠ² Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ‚ΠΈΠΏΠ°. Π’ этом состоит ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ классов Functor ΠΈ Applicative, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… экзСмплярами Π±Ρ‹Π»ΠΈ конструкторы Ρ‚ΠΈΠΏΠ°, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€.

ΠŸΠ΅Ρ€Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ являСтся mempty. На самом Π΄Π΅Π»Π΅ это Π½Π΅ функция, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π­Ρ‚ΠΎ полиморфная константа Π²Ρ€ΠΎΠ΄Π΅ minBound ΠΈΠ· класса Bounded. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ mempty прСдставляСт Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π°.

Π”Π°Π»Π΅Π΅, Ρƒ нас Π΅ΡΡ‚ΡŒ функция mappend, которая, ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠΆΠ΅, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, догадались, являСтся Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ. Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° значСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ самого Ρ‚ΠΈΠΏΠ°. РСшСниС Π½Π°Π·Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ mappend Π±Ρ‹Π»ΠΎ отчасти Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€ΠΎΠ΄Π΅ присоСдиняСм Π΄Π²Π° значСния. Π’ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ++ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° списка ΠΈ присоСдиняСт ΠΎΠ΄ΠΈΠ½ Π² ΠΊΠΎΠ½Π΅Ρ† Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ * Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ присоСдинСния – Π΄Π²Π° числа просто ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠ°ΡŽΡ‚ΡΡ. Когда Π²Ρ‹ встрСтитС Π΄Ρ€ΡƒΠ³ΠΈΠ΅ экзСмпляры класса Monoid, Π²Ρ‹ ΠΏΠΎΠΉΠΌΡ‘Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· Π½ΠΈΡ… Ρ‚ΠΎΠΆΠ΅ Π½Π΅ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ значСния. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΈΠ·Π±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΌΡ‹ΡΠ»ΠΈΡ‚ΡŒ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… присоСдинСния; просто рассматривайтС mappend ΠΊΠ°ΠΊ Π±ΠΈΠ½Π°Ρ€Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° ΠΌΠΎΠ½ΠΎΠΈΠ΄Π½Ρ‹Ρ… значСния ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅.

ПослСднСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ этого класса Ρ‚ΠΈΠΏΠΎΠ² являСтся mconcat. Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список ΠΌΠΎΠ½ΠΎΠΈΠ΄Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ сокращаСт ΠΈΡ… Π΄ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ значСния, примСняя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ mappend ΠΌΠ΅ΠΆΠ΄Ρƒ элСмСнтами списка. Она ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, которая просто ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ mempty Π² качСствС Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈ сворачиваСт список справа с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mappend. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ рСализация ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° экзСмпляров, ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ сильно ΠΏΠ΅Ρ€Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mconcat. Когда для ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ Ρ‚ΠΈΠΏΠ° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ экзСмпляр класса Monoid, достаточно Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ всСго лишь ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ mempty ΠΈ mappend. Π₯отя для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… экзСмпляров Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ mconcat ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ эффСктивно, Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв рСализация ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ идСально.