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

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

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

ΠŸΡ€ΠΈ использовании с дСйствиями Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° функция sequenceA прСдставляСт собой Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ функция sequence! Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список дСйствий Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ дСйствиС Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· этих дСйствий ΠΈ Π² качСствС своСго Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ список Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² этих дСйствий Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. Π’Π°ΠΊ происходит, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ [IO a] Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ IO [a], Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ дСйствиС Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅Π΅ список Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ, всС эти дСйствия Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π° Π·Π°Ρ‚Π΅ΠΌ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΎΠ΄Π½ΠΎ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ, ΠΊΠΎΠ³Π΄Π° потрСбуСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния. Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ дСйствия Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² Π΅Π³ΠΎ!

Π”Π°Π²Π°ΠΉΡ‚Π΅ помСстим Ρ‚Ρ€ΠΈ дСйствия Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° getLine Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ:

ghci> sequenceA [getLine, getLine, getLine]

эй

Ρ…ΠΎ

ΡƒΡ…

["эй","Ρ…ΠΎ","ΡƒΡ…"]

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‡Ρƒ, Ρ‡Ρ‚ΠΎ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹ Π½Π΅ просто интСрСсны, Π½ΠΎ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹. Они ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΠΌ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ вычислСния – ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, вычислСния с использованиСм Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ вычислСния, вычислСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³Π»ΠΈ ΠΎΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒΡΡ Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΈ Ρ‚. Π΄., – ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ. ΠŸΡ€ΠΎΡΡ‚ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² <$> ΠΈ <*> ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π»ΡŽΠ±Ρ‹ΠΌ количСством Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ прСимущСства сСмантики ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ….

12

ΠœΠΎΠ½ΠΎΠΈΠ΄Ρ‹

Π’ этой Π³Π»Π°Π²Π΅ прСдставлСн Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΈ интСрСсный класс Ρ‚ΠΈΠΏΠΎΠ² Monoid. Он сущСствуСт для Ρ‚ΠΈΠΏΠΎΠ², значСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Ρ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. ΠœΡ‹ рассмотрим, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΌΠΎΠ½ΠΎΠΈΠ΄Ρ‹ ΠΈ Ρ‡Ρ‚ΠΎ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°ΡŽΡ‚ ΠΈΡ… Π·Π°ΠΊΠΎΠ½Ρ‹. Π—Π°Ρ‚Π΅ΠΌ рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ½ΠΎΠΈΠ΄Ρ‹ Π² языкС Haskell ΠΈ обсудим, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°ΠΌ ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ.

И ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго Π΄Π°Π²Π°ΠΉΡ‚Π΅ взглянСм Π½Π° ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово newtype: ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ часто Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° углубимся Π² ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΈΡ€ ΠΌΠΎΠ½ΠΎΠΈΠ΄ΠΎΠ².

ΠžΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° Π² Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ

Пока Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ свои алгСбраичСскиС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово data. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Π²Π°Ρ‚ΡŒ синонимы ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΡΡ Ρ‚ΠΈΠΏΠ°ΠΌ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова type. Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π½ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π½Π° основС ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… с использованиСм ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова newtype. И Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Π΅ΠΌ всё это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΌ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ.

Π’ Π³Π»Π°Π²Π΅ 11 ΠΌΡ‹ обсудили ΠΏΠ°Ρ€Ρƒ способов, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… списковый Ρ‚ΠΈΠΏ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠΌ. Один ΠΈΠ· этих способов состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ <*> Π±Ρ€Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ· списка, ΡΠ²Π»ΡΡŽΡ‰Π΅Π³ΠΎΡΡ Π΅Π³ΠΎ Π»Π΅Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ, ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Ρ‘ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π² спискС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ находится справа, Ρ‡Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· Π»Π΅Π²ΠΎΠ³ΠΎ списка ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π² ΠΏΡ€Π°Π²ΠΎΠΌ:

ghci> [(+1),(*100),(*5)] <*> [1,2,3]

[2,3,4,100,200,300,5,10,15]

Π’Ρ‚ΠΎΡ€ΠΎΠΉ способ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π·ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ· списка слСва ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° <*> ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Ρ‘ ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ справа, Π·Π°Ρ‚Π΅ΠΌ Π²Π·ΡΡ‚ΡŒ Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ· списка слСва ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Ρ‘ ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ справа, ΠΈ Ρ‚. Π΄. Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счётС получаСтся Π½Π΅Ρ‡Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ застёгивания Π΄Π²ΡƒΡ… списков.

Но списки ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ экзСмпляр класса Applicative, поэтому ΠΊΠ°ΠΊ Π½Π°ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ для списков Π²Ρ‚ΠΎΡ€ΠΎΠΉ экзСмпляр класса Applicative? Как Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ, для этой Ρ†Π΅Π»ΠΈ Π±Ρ‹Π» Π²Π²Π΅Π΄Ρ‘Π½ Ρ‚ΠΈΠΏ ZipList a. Он ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ конструктор Π΄Π°Π½Π½Ρ‹Ρ… ZipList, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ»Π΅. ΠœΡ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ Π½Π°ΠΌΠΈ список Π² это ΠΏΠΎΠ»Π΅. Π”Π°Π»Π΅Π΅ для Ρ‚ΠΈΠΏΠ° ZipList опрСдСляСтся экзСмпляр класса Applicative, Ρ‡Ρ‚ΠΎΠ±Ρ‹, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ понадобится ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ списки Π² качСствС Π°ΠΏΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ² для застёгивания, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ просто ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΈΡ… с ΠΏΠΎ ΠΌΠΎΡ‰ΡŒΡŽ конструктора ZipList. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈ, Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ ΠΈΡ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ getZipList:

ghci> getZipList $ ZipList [(+1),(*100),(*5)] <*> ZipList [1,2,3]

[2,200,15]

Π˜Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊΠΎΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ это ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΌΡƒ слову newtype? Π₯ΠΎΡ€ΠΎΡˆΠΎ, ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅, ΠΊΠ°ΠΊ Π±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ объявлСниС data для нашСго Ρ‚ΠΈΠΏΠ° ZipList a! Π’ΠΎΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов:

data ZipList a = ZipList [a]

Π­Ρ‚ΠΎ Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ лишь ΠΎΠ΄Π½ΠΈΠΌ конструктором Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ этот конструктор Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ»Π΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся списком сущностСй. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синтаксис записСй с ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ полями, Ρ‡Ρ‚ΠΎΠ±Ρ‹ автоматичСски ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‰ΡƒΡŽ список ΠΈΠ· Ρ‚ΠΈΠΏΠ° ZipList:

data ZipList a = ZipList { getZipList :: [a] }

Π­Ρ‚ΠΎ прСкрасно смотрится ΠΈ Π½Π° самом Π΄Π΅Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ. Π£ нас Π±Ρ‹Π»ΠΎ Π΄Π²Π° способа ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ экзСмпляром класса Ρ‚ΠΈΠΏΠΎΠ², поэтому ΠΌΡ‹ использовали ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово data, Ρ‡Ρ‚ΠΎΠ±Ρ‹ просто ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ этот Ρ‚ΠΈΠΏ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ, ΠΈ сдСлали Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ экзСмпляром Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ способом.

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово newtype Π² языкС Haskell создано ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для Ρ‚Π΅Ρ… случаСв, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ просто Π²Π·ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΈΠΏ ΠΈ ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΅Π³ΠΎ Π²ΠΎ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ. Π’ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… сСйчас Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Ρ‚ΠΈΠΏ ZipList a ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

newtype ZipList a = ZipList { getZipList :: [a] }

ВмСсто ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова data ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ newtype. Π’Π΅ΠΏΠ΅Ρ€ΡŒ разбСрёмся, ΠΏΠΎΡ‡Π΅ΠΌΡƒ. Ну, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, дСкларация newtype быстрСС. Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово data для оборачивания Ρ‚ΠΈΠΏΠ°, ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Β«Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы» Π½Π° всС эти оборачивания ΠΈ разворачивания, ΠΊΠΎΠ³Π΄Π° ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° выполняСтся. Но Ссли Π²Ρ‹ воспользовались ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом newtype, язык Haskell Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ просто примСняСтС Π΅Π³ΠΎ для оборачивания ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° Π² Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ (ΠΎΡ‚ΡΡŽΠ΄Π° Π½Π°Π·Π²Π°Π½ΠΈΠ΅), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ ΠΎΠ½ остался Ρ‚Π΅ΠΌ ΠΆΠ΅, Π½ΠΎ ΠΈΠΌΠ΅Π» ΠΈΠ½ΠΎΠΉ Ρ‚ΠΈΠΏ. По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ язык Haskell ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ оборачивания ΠΈ разворачивания, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π΅ΡˆΠΈΡ‚, ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

Π’Π°ΠΊ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ всСгда Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ newtype вмСсто data? Когда Π²Ρ‹ создаётС Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΈΠ· ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π³ΠΎΡΡ Ρ‚ΠΈΠΏΠ°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово newtype, Ρƒ вас ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ конструктор значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ»Π΅. Но с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова data Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ нСсколько конструкторов значСния, ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ конструктор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ноль ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅ΠΉ:

data Profession = Fighter | Archer | Accountant


data Race = Human | Elf | Orc | Goblin


data PlayerCharacter = PlayerCharacter Race Profession

ΠŸΡ€ΠΈ использовании ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова newtype ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово deriving – Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ Π±Ρ‹ Π΄Π΅Π»Π°Π»ΠΈ это с Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠ΅ΠΉ data. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ автоматичСски ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒ экзСмпляры для классов Eq, Ord, Enum, Bounded, Show ΠΈ Read. Если ΠΌΡ‹ ΠΏΠΎΡ€ΠΎΠ΄ΠΈΠΌ экзСмпляр для класса Ρ‚ΠΈΠΏΠ°, Ρ‚ΠΎ ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ Π½Π°ΠΌΠΈ Ρ‚ΠΈΠΏ ΡƒΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ экзСмпляр для Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса Ρ‚ΠΈΠΏΠΎΠ². Π­Ρ‚ΠΎ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово newtype всСго лишь ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ смоТСм ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ ΠΈ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ значСния нашСго Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Ссли сдСлаСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

newtype CharList = CharList { getCharList :: [Char] } deriving (Eq, Show)

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ:

ghci> CharList "Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ!"

CharList {getCharList = "Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ!"}

ghci> CharList "Π±Π΅Π½Π½ΠΈ" == CharList "Π±Π΅Π½Π½ΠΈ"

True

ghci> CharList "Π±Π΅Π½Π½ΠΈ" == CharList "устрицы"

False

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ случаС использования ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова newtype конструктор Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ:

CharList :: [Char] –> CharList

Он Π±Π΅Ρ€Ρ‘Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° [Char] ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° CharList. Из ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², Π³Π΄Π΅ ΠΌΡ‹ использовали конструктор Π΄Π°Π½Π½Ρ‹Ρ… CharList, Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Π°ΠΊ ΠΎΠ½ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ. И Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, функция getCharList, которая Π±Ρ‹Π»Π° автоматичСски сгСнСрирована Π·Π° нас (ΠΏΠΎΡ‚ΠΎΠΌΡƒ ΠΊΠ°ΠΊ ΠΌΡ‹ использовали синтаксис записСй с ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ полями Π² нашСй Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ newtype), ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ:

getCharList :: CharList –> [Char]

Она Π±Π΅Ρ€Ρ‘Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° CharList ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° [Char]. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ это ΠΊΠ°ΠΊ ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΈ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ это ΠΊΠ°ΠΊ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

ИспользованиС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова newtype для создания экзСмпляров классов Ρ‚ΠΈΠΏΠΎΠ²

Часто ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ наши Ρ‚ΠΈΠΏΡ‹ экзСмплярами ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… классов Ρ‚ΠΈΠΏΠΎΠ², Π½ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ° просто Π½Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ трСбуСтся. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ для Ρ‚ΠΈΠΏΠ° Maybe экзСмпляр класса Functor Π»Π΅Π³ΠΊΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ класс Ρ‚ΠΈΠΏΠΎΠ² Functor ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

class Functor f where

   fmap :: (a -> b) -> f a -> f b

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ просто Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ с этого:

instance Functor Maybe where

А ΠΏΠΎΡ‚ΠΎΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ fmap.



ВсС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ° ΡΠΎΠ³Π»Π°ΡΡƒΡŽΡ‚ΡΡ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ Maybe Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ мСсто ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° f Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса Ρ‚ΠΈΠΏΠΎΠ² Functor. Если Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ fmap, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Ρ‚ΠΈΠΏΠΎΠΌ Maybe, Π² ΠΈΡ‚ΠΎΠ³Π΅ ΠΎΠ½Π° Π²Π΅Π΄Ρ‘Ρ‚ сСбя Π²ΠΎΡ‚ Ρ‚Π°ΠΊ: