ΠΠ°ΠΊΠΎΠ½Ρ ΠΌΠΎΠ½ΠΎΠΈΠ΄ΠΎΠ²
ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΊ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°ΠΌ ΠΊΠ»Π°ΡΡΠ° 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.