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

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

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

Π—Π°ΠΊΠΎΠ½Ρ‹ ΠΌΠΎΠ½ΠΎΠΈΠ΄ΠΎΠ²

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ экзСмплярам класса Monoid, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ рассмотрим Π·Π°ΠΊΠΎΠ½Ρ‹ ΠΌΠΎΠ½ΠΎΠΈΠ΄ΠΎΠ².

Π’Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ дСйствуСт ΠΊΠ°ΠΊ тоТдСство ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ Ρ‡Ρ‚ΠΎ бинарная функция Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ассоциативна. МоТно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляры класса Monoid, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ этим ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ, Π½ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ экзСмпляры Π½ΠΈΠΊΠΎΠΌΡƒ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ класс Ρ‚ΠΈΠΏΠΎΠ² Monoid, ΠΌΡ‹ полагаСмся Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ экзСмпляры Π²Π΅Π΄ΡƒΡ‚ сСбя ΠΊΠ°ΠΊ ΠΌΠΎΠ½ΠΎΠΈΠ΄Ρ‹. Π˜Π½Π°Ρ‡Π΅ ΠΊΠ°ΠΊΠΎΠΉ Π² этом смысл? ИмСнно поэтому ΠΏΡ€ΠΈ создании экзСмпляров класса Monoid ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π½ΠΈΠΆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΌ Π·Π°ΠΊΠΎΠ½Π°ΠΌ:

β€’ mempty `mappend` x = x

β€’ x `mappend` mempty = x

β€’ (x `mappend` y) `mappend` z = x `mappend` (y `mappend` z)

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° Π·Π°ΠΊΠΎΠ½Π° ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ mempty Π΄ΠΎΠ»ΠΆΠ½ΠΎ вСсти сСбя ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΠΈΡ†Π° ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mappend, Π° Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ функция mappend Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ассоциативна (порядок, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ mappend для свСдСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΌΠΎΠ½ΠΎΠΈΠ΄Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² ΠΎΠ΄Π½ΠΎ, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния). Π―Π·Ρ‹ΠΊ Haskell Π½Π΅ провСряСт опрСдСляСмыС экзСмпляры Π½Π° соотвСтствиС этим Π·Π°ΠΊΠΎΠ½Π°ΠΌ, поэтому ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ наши экзСмпляры Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ выполняли ΠΈΡ….

ΠŸΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π°ΠΌΠΈ

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

Бписки ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π°ΠΌΠΈ

Π”Π°, списки ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π°ΠΌΠΈ! Как Π²Ρ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, функция ++ с пустым списком [] ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ ΠΌΠΎΠ½ΠΎΠΈΠ΄. ЭкзСмпляр ΠΎΡ‡Π΅Π½ΡŒ прост:

instance Monoid [a] where

   mempty = []

   mappend = (++)

Для списков имССтся экзСмпляр класса Monoid нСзависимо ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ содСрТат. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ написали instance Monoid [a], Π° Π½Π΅ instance Monoid [], ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ класс Monoid Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ для экзСмпляра.

ΠŸΡ€ΠΈ тСстировании ΠΌΡ‹ Π½Π΅ встрСчаСм ΡΡŽΡ€ΠΏΡ€ΠΈΠ·ΠΎΠ²:

ghci> [1,2,3] `mappend` [4,5,6]

[1,2,3,4,5,6]

ghci> ("ΠΎΠ΄ΠΈΠ½" `mappend` "Π΄Π²Π°") `mappend` "Ρ‚Ρ€ΠΈ"

"ΠΎΠ΄ΠΈΠ½Π΄Π²Π°Ρ‚Ρ€ΠΈ"

ghci> "ΠΎΠ΄ΠΈΠ½" `mappend` ("Π΄Π²Π°" `mappend` "Ρ‚Ρ€ΠΈ")

"ΠΎΠ΄ΠΈΠ½Π΄Π²Π°Ρ‚Ρ€ΠΈ"

ghci> "ΠΎΠ΄ΠΈΠ½" `mappend` "Π΄Π²Π°" `mappend` "Ρ‚Ρ€ΠΈ"

"ΠΎΠ΄ΠΈΠ½Π΄Π²Π°Ρ‚Ρ€ΠΈ"

ghci> "Π±Π°Ρ…" `mappend` mempty

"Π±Π°Ρ…"

ghci> mconcat [[1,2],[3,6],[9]]

[1,2,3,6,9]

ghci> mempty :: [a]

[]

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² послСднСй строкС ΠΌΡ‹ написали ΡΠ²Π½ΡƒΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠ°. Если Π±Ρ‹ Π±Ρ‹Π»ΠΎ написано просто mempty, Ρ‚ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ GHCi Π½Π΅ Π·Π½Π°Π» Π±Ρ‹, ΠΊΠ°ΠΊΠΎΠΉ экзСмпляр ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, поэтому ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ списковый экзСмпляр. ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ Ρ‚ΠΈΠΏ [a] (Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ указания [Int] ΠΈΠ»ΠΈ [String]), ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ пустой список ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Π±ΡƒΠ΄Ρ‚ΠΎ ΠΎΠ½ содСрТит любой Ρ‚ΠΈΠΏ.



ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ функция mconcat ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π΅Ρ‘ просто Ρ‚Π°ΠΊ, ΠΊΠΎΠ³Π΄Π° опрСдСляСм экзСмпляр класса Monoid для ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ Ρ‚ΠΈΠΏΠ°. Π’ случаС со списком функция mconcat соотвСтствуСт просто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ concat. Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список списков ΠΈ Β«Ρ€Π°Π·Π³Π»Π°ΠΆΠΈΠ²Π°Π΅Ρ‚Β» Π΅Π³ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это Ρ€Π°Π²Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ Π²Ρ‹Π·ΠΎΠ²Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ++ ΠΌΠ΅ΠΆΠ΄Ρƒ всСми смСТными списками, содСрТащимися Π² спискС.

Π—Π°ΠΊΠΎΠ½Ρ‹ ΠΌΠΎΠ½ΠΎΠΈΠ΄ΠΎΠ² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ для экзСмпляра списка. Когда Ρƒ нас Π΅ΡΡ‚ΡŒ нСсколько списков ΠΈ ΠΌΡ‹ объСдиняСм ΠΈΡ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mappend (ΠΈΠ»ΠΈ ++), Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния, ΠΊΠ°ΠΊΠΈΠ΅ списки ΠΌΡ‹ соСдиняСм ΠΏΠ΅Ρ€Π²Ρ‹ΠΌΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅ ΠΎΠ½ΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ Π½Π° ΠΊΠΎΠ½Ρ†Π°Ρ…. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, пустой список дСйствуСт ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΠΈΡ†Π°, поэтому всё Ρ…ΠΎΡ€ΠΎΡˆΠΎ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ½ΠΎΠΈΠ΄Ρ‹ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выраТСния a `mappend` b Π±Ρ‹Π» Ρ€Π°Π²Π΅Π½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ выраТСния b `mappend` a. Π’ случаС со списками ΠΎΠ½ΠΈ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ Π½Π΅ Ρ€Π°Π²Π½Ρ‹:

ghci> "ΠΎΠ΄ΠΈΠ½" `mappend` "Π΄Π²Π°"

"ΠΎΠ΄ΠΈΠ½Π΄Π²Π°"

ghci> "Π΄Π²Π°" `mappend` "ΠΎΠ΄ΠΈΠ½"

"Π΄Π²Π°ΠΎΠ΄ΠΈΠ½"

И это Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ. Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠΈ выраТСния 3 * 5 ΠΈ 5 * 3 Π΄Π°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, – это просто свойство умноТСния, Π½ΠΎ ΠΎΠ½ΠΎ Π½Π΅ выполняСтся для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΌΠΎΠ½ΠΎΠΈΠ΄ΠΎΠ².

Π’ΠΈΠΏΡ‹ Product ΠΈ Sum

ΠœΡ‹ ΡƒΠΆΠ΅ ΠΈΠ·ΡƒΡ‡ΠΈΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ числа ΠΊΠ°ΠΊ ΠΌΠΎΠ½ΠΎΠΈΠ΄Ρ‹: просто ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ *, Π° Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ – Π±Ρ‹Ρ‚ΡŒ 1. Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ способ для чисСл Π±Ρ‹Ρ‚ΡŒ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π°ΠΌΠΈ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² качСствС Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ выступал ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ +, Π° Π² качСствС Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠ³ΠΎ значСния – Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0:

ghci> 0 + 4

4

ghci> 5 + 0

5

ghci> (1 + 3) + 5

9

ghci> 1 + (3 + 5)

9

Π—Π°ΠΊΠΎΠ½Ρ‹ ΠΌΠΎΠ½ΠΎΠΈΠ΄ΠΎΠ² Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ ΠΏΡ€ΠΈΠ±Π°Π²ΠΈΡ‚Π΅ 0 ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ числу, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС число. Π‘Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ ассоциативно, поэтому здСсь Ρƒ нас Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Π˜Ρ‚Π°ΠΊ, Π² нашСм распоряТСнии Π΄Π²Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ ΠΏΡ€Π°Π²ΠΎΠΌΠ΅Ρ€Π½Ρ‹Ρ… способа для чисСл Π±Ρ‹Ρ‚ΡŒ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π°ΠΌΠΈ. Какой ΠΆΠ΅ способ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ?.. Π›Π°Π΄Π½ΠΎ, ΠΌΡ‹ Π½Π΅ обязаны Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ! ВспомнитС, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° имССтся нСсколько способов опрСдСлСния для ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ Ρ‚ΠΈΠΏΠ° экзСмпляра ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ класса Ρ‚ΠΈΠΏΠΎΠ², ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ этот Ρ‚ΠΈΠΏ Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡŽ newtype, Π° Π·Π°Ρ‚Π΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ для Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° экзСмпляр класса Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ. МоТно ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ нСсовмСстимоС.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ Data.Monoid экспортируСт для этого Π΄Π²Π° Ρ‚ΠΈΠΏΠ°: Product ΠΈ Sum.

Product ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

newtype Product a = Product { getProduct :: a }

   deriving (Eq, Ord, Read, Show, Bounded)

Π­Ρ‚ΠΎ всСго лишь ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ° newtype с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Ρ‚ΠΈΠΏΠ° наряду с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Ρ‘Π½Π½Ρ‹ΠΌΠΈ экзСмплярами. Π•Π³ΠΎ экзСмпляр для класса Monoid выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

instance Num a => Monoid (Product a) where

   mempty = Product 1

   Product x `mappend` Product y = Product (x * y)

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ mempty – это просто 1, обёрнутая Π² конструктор Product. Ѐункция mappend ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ сопоставлСниС конструктора Product с ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ, ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠ°Π΅Ρ‚ Π΄Π²Π° числа, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ число. Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, имССтся ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ класса Num a. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Product a являСтся экзСмпляром Monoid для всСх Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° a, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΠΆΠ΅ имССтся экзСмпляр класса Num. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Product a Π² качСствС ΠΌΠΎΠ½ΠΎΠΈΠ΄Π°, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ произвСсти Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΈ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ newtype:

ghci> getProduct $ Product 3 `mappend` Product 9

27

ghci> getProduct $ Product 3 `mappend` mempty

3

ghci> getProduct $ Product 3 `mappend` Product 4 `mappend` Product 2

24

ghci> getProduct . mconcat . map Product $ [3,4,2]

24

Π’ΠΈΠΏ Sum ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ Π΄ΡƒΡ…Π΅, Ρ‡Ρ‚ΠΎ ΠΈ Ρ‚ΠΈΠΏ Product, ΠΈ экзСмпляр Ρ‚ΠΎΠΆΠ΅ ΠΏΠΎΡ…ΠΎΠΆ. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΅Π³ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅:

ghci> getSum $ Sum 2 `mappend` Sum 9

11

ghci> getSum $ mempty `mappend` Sum 3

3

ghci> getSum . mconcat . map Sum $ [1,2,3]

6

Π’ΠΈΠΏΡ‹ Any ΠΈ All

Π•Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΈΠΌ Ρ‚ΠΈΠΏΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠ½ΠΎΠΈΠ΄ двумя Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ, Π½ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ допустимыми способами, являСтся Bool. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ способ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ||, которая прСдставляСт собой логичСскоС Π˜Π›Π˜, Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ бинарная функция, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ False Π² качСствС Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠ³ΠΎ значСния. Если ΠΏΡ€ΠΈ использовании логичСского Π˜Π›Π˜ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ€Π°Π²Π΅Π½ True, функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ True; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ False. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ссли ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ False Π² качСствС Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠ³ΠΎ значСния, опСрация Π˜Π›Π˜ Π²Π΅Ρ€Π½Ρ‘Ρ‚ False ΠΏΡ€ΠΈ использовании с False – ΠΈ True ΠΏΡ€ΠΈ использовании с True. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ newtype Any Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΠΌΠ΅Π΅Ρ‚ экзСмпляр класса Monoid. Он ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

newtype Any = Any { getAny :: Bool }

   deriving (Eq, Ord, Read, Show, Bounded)

А Π΅Π³ΠΎ экзСмпляр выглядит Ρ‚Π°ΠΊ:

instance Monoid Any where

   mempty = Any False

   Any x `mappend` Any y = Any (x || y)

Он называСтся Any, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ x `mappend` y Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ True, Ссли любоС ΠΈΠ· этих Π΄Π²ΡƒΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ€Π°Π²Π½ΠΎ True. Π”Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° Ρ‚Ρ€ΠΈ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Bool, ΠΎΠ±Ρ‘Ρ€Π½ΡƒΡ‚Ρ‹Ρ… Π² Any, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mappend, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ True, Ссли любоС ΠΈΠ· Π½ΠΈΡ… Ρ€Π°Π²Π½ΠΎ True.

ghci> getAny $ Any True `mappend` Any False

True

ghci> getAny $ mempty `mappend` Any True

True

ghci> getAny . mconcat . map Any $ [False, False, False, True]

True

ghci> getAny $ mempty `mappend` mempty

False

Π”Ρ€ΡƒΠ³ΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ экзСмпляра класса Monoid для Ρ‚ΠΈΠΏΠ° Bool – всё ΠΊΠ°ΠΊ Π±Ρ‹ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚: Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ && Π±Ρ‹Ρ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, Π° Π·Π°Ρ‚Π΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. ЛогичСскоС И Π²Π΅Ρ€Π½Ρ‘Ρ‚ True, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΎΠ±Π° Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ€Π°Π²Π½Ρ‹ True.