ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ°. ΠΠ½ΠΎ Π³ΠΎΠ²ΠΎΡΠΈΡ, ΡΡΠΎ ΡΠΈΠΏ Maybe ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠΎΠ½ΠΎΠΈΠ΄ΠΎΠΌ, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ Π΄Π»Ρ ΡΠΈΠΏΠ° a ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Monoid. ΠΡΠ»ΠΈ ΠΌΡ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌ Π½Π΅ΡΡΠΎ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Nothing, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ½ΠΊΡΠΈΡ mappend, ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠΎ Π½Π΅ΡΡΠΎ. ΠΡΠ»ΠΈ ΠΌΡ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌ Π΄Π²Π° Π·Π½Π°ΡΠ΅Π½ΠΈΡ Just Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ mappend, ΡΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Just ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, Π° Π·Π°ΡΠ΅ΠΌ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Just. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ° Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ΡΠΈΠΏ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π²Π½ΡΡΡΠΈ Just, ΠΈΠΌΠ΅Π΅Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Monoid.
ghci> Nothing `mappend` Just "Π°Π½Π΄ΡΠ΅ΠΉ"
Just "Π°Π½Π΄ΡΠ΅ΠΉ"
ghci> Just LT `mappend` Nothing
Just LT
ghci> Just (Sum 3) `mappend` Just (Sum 4)
Just (Sum {getSum = 7})
ΠΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ Ρ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π°ΠΌΠΈ ΠΊΠ°ΠΊ Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°ΠΌΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³Π»ΠΈ ΠΎΠΊΠΎΠ½ΡΠΈΡΡΡΡ Π½Π΅ΡΡΠΏΠ΅ΡΠ½ΠΎ. ΠΠ·-Π·Π° Π½Π°Π»ΠΈΡΠΈΡ ΡΡΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ, ΠΎΠΊΠΎΠ½ΡΠΈΠ»ΠΈΡΡ Π»ΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π½Π΅ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡ, Π²Π΅ΡΠ½ΡΠ»ΠΈ ΠΎΠ½ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Nothing ΠΈΠ»ΠΈ Just; ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΈΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΠΌΠΎΠ½ΠΎΠΈΠ΄Ρ.
ΠΠΎ ΡΡΠΎ Π΅ΡΠ»ΠΈ ΡΠΈΠΏ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Maybe Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΊΠ»Π°ΡΡΠ° Monoid? ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠ»Π°Π³Π°ΡΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΡΠ΅ ΡΠ²Π»ΡΡΡΡΡ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π°ΠΌΠΈ, β ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° ΠΎΠ±Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ mappend ΠΎΠ±ΡΡΠ½ΡΡΡ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Just. ΠΠΎΠ³Π΄Π° ΠΌΡ Π½Π΅ Π·Π½Π°Π΅ΠΌ, ΡΠ²Π»ΡΡΡΡΡ Π»ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΡΠ΅ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π°ΠΌΠΈ, ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ mappend ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ; ΡΠ°ΠΊ ΡΡΠΎ ΠΆΠ΅ Π½Π°ΠΌ Π΄Π΅Π»Π°ΡΡ? ΠΡ, Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅, ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ, β ΡΡΠΎ ΠΎΡΠ²Π΅ΡΠ³Π½ΡΡΡ Π²ΡΠΎΡΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΏΠ΅ΡΠ²ΠΎΠ΅. ΠΠ»Ρ ΡΡΠΎΠΉ ΡΠ΅Π»ΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠΈΠΏ First a. ΠΠΎΡ Π΅Π³ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅:
newtype First a = First { getFirst :: Maybe a }
deriving (Eq, Ord, Read, Show)
ΠΡ Π±Π΅ΡΡΠΌ ΡΠΈΠΏ Maybe a ΠΈ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ Π΅Π³ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΈ newtype. ΠΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Monoid Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
instance Monoid (Firsta) where
mempty = First Nothing
First (Just x) `mappend` _ = First (Just x)
First Nothing `mappend` x = x
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ mempty β ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ Nothing, ΠΎΠ±ΡΡΠ½ΡΡΠΎΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° First. ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ mappend ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Just, ΠΌΡ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΠΌ Π²ΡΠΎΡΠΎΠΉ. ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ β Nothing, ΡΠΎΠ³Π΄Π° ΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π²ΡΠΎΡΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΠΎΠ½ Just ΠΈΠ»ΠΈ Nothing:
ghci> getFirst $ First (Just 'a') `mappend` First (Just 'b')
Just 'a'
ghci> getFirst $ First Nothing `mappend` First (Just 'b')
Just 'b'
ghci> getFirst $ First (Just 'a') `mappend` First Nothing
Just 'a'
Π’ΠΈΠΏ First ΠΏΠΎΠ»Π΅Π·Π΅Π½, ΠΊΠΎΠ³Π΄Π° Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΡΠΈΠΏΠ° Maybe ΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ Π·Π½Π°ΡΡ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΠΈΠ· Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Just. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π³ΠΎΠ΄ΠΈΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ mconcat:
ghci> getFirst . mconcat . map First $ [Nothing, Just 9, Just 10]
Just 9
ΠΡΠ»ΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ΅Π½ ΠΌΠΎΠ½ΠΎΠΈΠ΄ Π½Π° Π·Π½Π°ΡΠ΅Π½ΠΈΡΡ Maybe a β ΡΠ°ΠΊΠΎΠΉ, ΡΡΠΎΠ±Ρ ΠΎΡΡΠ°Π²Π°Π»ΡΡ Π²ΡΠΎΡΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ mappend ΡΠ²Π»ΡΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ Just, ΡΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ Data.Monoid ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΈΠΏ Last a, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΠΊΠ°ΠΊ ΠΈ ΡΠΈΠΏ First a, Π½ΠΎ ΠΏΡΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ mappend ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ mconcat ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π½Π΅ ΡΠ²Π»ΡΡΡΠ΅Π΅ΡΡ Nothing:
ghci> getLast . mconcat . map Last $ [Nothing, Just 9, Just 10]
Just 10
ghci> getLast $ Last (Just "ΠΎΠ΄ΠΈΠ½") `mappend` Last (Just "Π΄Π²Π°")
Just "two"
Π‘Π²ΡΡΡΠΊΠ° Π½Π° ΠΌΠΎΠ½ΠΎΠΈΠ΄Π°Ρ
ΠΠ΄ΠΈΠ½ ΠΈΠ· ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² Π²Π²Π΅ΡΡΠΈ ΠΌΠΎΠ½ΠΎΠΈΠ΄Ρ Π² ΡΠ°Π±ΠΎΡΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π°Π»ΠΈ Π½Π°ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΠ²ΡΡΡΠΊΠΈ Π½Π°Π΄ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΡΡΡΡΠΊΡΡΡΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ . ΠΠΎ ΡΠΈΡ ΠΏΠΎΡ ΠΌΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠ»ΠΈ ΡΠ²ΡΡΡΠΊΠΈ ΡΠΎΠ»ΡΠΊΠΎ Π½Π°Π΄ ΡΠΏΠΈΡΠΊΠ°ΠΌΠΈ, Π½ΠΎ ΡΠΏΠΈΡΠΊΠΈ β Π½Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ ΡΡΡΡΠΊΡΡΡΠ° Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²Π΅ΡΠ½ΡΡΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΠ²ΡΡΡΠΊΠΈ ΠΏΠΎΡΡΠΈ Π½Π°Π΄ Π»ΡΠ±ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠΎΠΉ Π΄Π°Π½Π½ΡΡ . ΠΡΠΎΠ±Π΅Π½Π½ΠΎ Ρ ΠΎΡΠΎΡΠΎ ΠΏΠΎΠ΄Π΄Π°ΡΡΡΡ ΡΠ²ΡΡΡΠΊΠ΅ Π΄Π΅ΡΠ΅Π²ΡΡ.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΡΠΊΡΡΡ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΠΎΡΠΎΡΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎ ΡΠ²ΡΡΡΠΊΠ°ΠΌΠΈ, Π±ΡΠ» Π²Π²Π΅Π΄ΡΠ½ ΠΊΠ»Π°ΡΡ ΡΠΈΠΏΠΎΠ² Foldable. ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ ΡΠΎΠΌΡ ΠΊΠ°ΠΊ ΠΊΠ»Π°ΡΡ Functor ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ, ΠΊΠ»Π°ΡΡ Foldable ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ Π²Π΅ΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ²ΡΡΠ½ΡΡΡ! ΠΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π² ΠΌΠΎΠ΄ΡΠ»Π΅ Data.Foldable; ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΡΠΎΡΡΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡΡΡ Ρ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Prelude, Π΅Π³ΠΎ Π»ΡΡΡΠ΅ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ, ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΡΡ (ΠΈ ΠΏΠΎΠ΄Π°Π²Π°ΡΡ Ρ Π±Π°Π·ΠΈΠ»ΠΈΠΊΠΎΠΌ!):
import qualified Data.Foldable as F
Π§ΡΠΎΠ±Ρ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΡ Π΄ΡΠ°Π³ΠΎΡΠ΅Π½Π½ΡΠ΅ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ»Π°Π²ΠΈΡ, ΠΌΡ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ, ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΡΡ ΠΊΠ°ΠΊ F.
Π’Π°ΠΊ ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΡΠΎΡ ΠΊΠ»Π°ΡΡ ΡΠΈΠΏΠΎΠ²? Π‘ΡΠ΅Π΄ΠΈ Π½ΠΈΡ Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ foldr, foldl, foldr1 ΠΈ foldl1. ΠΡ ΠΈ?.. ΠΡ ΡΠΆΠ΅ Π΄Π°Π²Π½ΠΎ Π·Π½Π°ΠΊΠΎΠΌΡ Ρ Π½ΠΈΠΌΠΈ! Π§ΡΠΎ ΠΆ Π² ΡΡΠΎΠΌ Π½ΠΎΠ²ΠΎΠ³ΠΎ? ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΡΠ°Π²Π½ΠΈΠΌ ΡΠΈΠΏΡ ΡΡΠ½ΠΊΡΠΈΠΈ foldr ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Foldable ΠΈ ΠΎΠ΄Π½ΠΎΠΈΠΌΡΠ½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Prelude, ΡΡΠΎΠ±Ρ ΡΠ·Π½Π°ΡΡ, ΡΠ΅ΠΌ ΠΎΠ½ΠΈ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ:
ghci> :t foldr
foldr :: (a β> b β> b) β> b β> [a] β> b
ghci> :t F.foldr
F.foldr :: (F.Foldable t) => (a β> b β> b) β> b β> t a β> b
Π-Π°-Π°! ΠΠ½Π°ΡΠΈΡ, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡ foldr ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ ΠΈ ΡΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅Ρ Π΅Π³ΠΎ, ΡΡΠ½ΠΊΡΠΈΡ foldr ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ Data.Foldable ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π»ΡΠ±ΠΎΠΉ ΡΠΈΠΏ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²Π΅ΡΠ½ΡΡΡ, β Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΈΡΠΊΠΈ! ΠΠ°ΠΊ ΠΈ ΠΎΠΆΠΈΠ΄Π°Π»ΠΎΡΡ, ΠΎΠ±Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ foldr Π΄Π΅Π»Π°ΡΡ ΡΠΎ ΡΠΏΠΈΡΠΊΠ°ΠΌΠΈ ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅:
ghci> foldr (*) 1 [1,2,3]
6
ghci> F.foldr (*) 1 [1,2,3]
6
ΠΡΡΠ³ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠΎΠΉ Π΄Π°Π½Π½ΡΡ , ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠ΅ΠΉ ΡΠ²ΡΡΡΠΊΡ, ΡΠ²Π»ΡΠ΅ΡΡΡ Maybe, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ Π²ΡΠ΅ Π·Π½Π°Π΅ΠΌ ΠΈ Π»ΡΠ±ΠΈΠΌ!
ghci> F.foldl (+) 2 (Just 9)
11
ghci> F.foldr (||) False (Just True)
True
ΠΠΎ ΡΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Maybe Π½Π΅ ΠΎΡΠ΅Π½Ρ-ΡΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ. ΠΠ½ΠΎ Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ ΠΏΡΠΎΡΡΠΎ ΠΊΠ°ΠΊ ΡΠΏΠΈΡΠΎΠΊ Ρ ΠΎΠ΄Π½ΠΈΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ, Π΅ΡΠ»ΠΈ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Just, ΠΈ ΠΊΠ°ΠΊ ΠΏΡΡΡΠΎΠΉ ΡΠΏΠΈΡΠΎΠΊ, Π΅ΡΠ»ΠΈ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Nothing. ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΡ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ .
ΠΠΎΠΌΠ½ΠΈΡΠ΅ Π΄ΡΠ΅Π²ΠΎΠ²ΠΈΠ΄Π½ΡΡ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ ΠΈΠ· Π³Π»Π°Π²Ρ 7? ΠΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π΅Ρ ΡΠ°ΠΊ:
data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving (Show)
ΠΡ ΡΠ·Π½Π°Π»ΠΈ, ΡΡΠΎ Π΄Π΅ΡΠ΅Π²ΠΎ β ΡΡΠΎ Π»ΠΈΠ±ΠΎ ΠΏΡΡΡΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, Π»ΠΈΠ±ΠΎ ΡΠ·Π΅Π», ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΎΠ΄Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π° ΡΠ°ΠΊΠΆΠ΅ Π΄Π²Π° Π΄ΡΡΠ³ΠΈΡ Π΄Π΅ΡΠ΅Π²Π°. ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΌΡ Π΅Π³ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ, ΠΌΡ ΡΠ΄Π΅Π»Π°Π»ΠΈ Π΄Π»Ρ Π½Π΅Π³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Functor, ΠΈ ΡΡΠΎ Π΄Π°Π»ΠΎ Π½Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ Π΅Π³ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ½ΠΊΡΠΈΡ fmap. Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ Π΄Π»Ρ Π½Π΅Π³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Foldable, ΡΡΠΎΠ±Ρ Ρ Π½Π°Ρ ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡ Π΅Π³ΠΎ ΡΠ²ΡΡΡΠΊΡ.
ΠΠ΄ΠΈΠ½ ΠΈΠ· ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠ΄Π΅Π»Π°ΡΡ Π΄Π»Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΡΠΈΠΏΠ° ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Foldable ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΡΡΠΎ Π½Π°ΠΏΡΡΠΌΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π½Π΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΡ foldr. ΠΠΎ Π΄ΡΡΠ³ΠΎΠΉ, ΡΠ°ΡΡΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ foldMap, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° ΡΠΈΠΏΠΎΠ² Foldable. Π£ Π½Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠΈΠΏ:
foldMap :: (Monoid m, Foldable t) => (a β> m) β> t a β> m
ΠΡ ΠΏΠ΅ΡΠ²ΡΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠ°Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½Π°ΡΠ° ΡΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΠ°Ρ ΡΡΡΡΠΊΡΡΡΠ° (ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ Π·Π΄Π΅ΡΡ ΠΊΠ°ΠΊ a), ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ°Ρ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΡΠΎΡΠΎΠΉ Π΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ β ΡΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΠ°Ρ ΡΡΡΡΠΊΡΡΡΠ°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ°Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΈΠΏΠ° a. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΡΡΡΡΠΊΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Ρ ΡΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΡΡ ΡΡΡΡΠΊΡΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΠ°ΡΠ΅ΠΌ, ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΡ ΡΡΠΈ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ mappend, ΠΎΠ½Π° ΡΠ²ΠΎΠ΄ΠΈΡ ΠΈΡ Π²ΡΠ΅ Π² ΠΎΠ΄Π½ΠΎ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠ°Π½Π½ΠΎΠΉ, Π½ΠΎ Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎ Π΅Ρ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ. Π ΡΠ°ΠΊΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΡΠΈΠΏΠ° ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Foldable! ΠΠΎΡΡΠΎΠΌΡ Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ foldMap Π΄Π»Ρ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΡΠΈΠΏΠ°, ΡΠΎ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ foldr ΠΈ foldl Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π΄Π°ΡΠΎΠΌ!
ΠΠΎΡ ΠΊΠ°ΠΊ ΠΌΡ Π΄Π΅Π»Π°Π΅ΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Foldable Π΄Π»Ρ ΡΠΈΠΏΠ°:
instance F.Foldable Tree where
foldMap f EmptyTree = mempty
foldMap f (Node x l r) = F.foldMap f l `mappend`
f x `mappend`
F.foldMap f r
ΠΡΠ»ΠΈ Π½Π°ΠΌ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π° ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π½Π°ΡΠ΅Π³ΠΎ Π΄Π΅ΡΠ΅Π²Π° ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΠΎ ΠΊΠ°ΠΊ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡ Π½Π°ΡΠ΅ ΡΠ΅Π»ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ Π² ΠΎΠ΄Π½ΠΎ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅? ΠΠΎΠ³Π΄Π° ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ fmap Ρ Π½Π°ΡΠΈΠΌ Π΄Π΅ΡΠ΅Π²ΠΎΠΌ, ΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Ρ Ρ Π΅Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ·Π΅Π», Π° Π·Π°ΡΠ΅ΠΌ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π»ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π»Π΅Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²ΠΎ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠ°Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²ΠΎ. ΠΠ΄Π΅ΡΡ Π½Π°ΡΠ° Π·Π°Π΄Π°ΡΠ° ΡΠΎΡΡΠΎΠΈΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ, Π½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΈ Π² ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π² ΠΎΠ΄Π½ΠΎ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ mappend. Π‘Π½Π°ΡΠ°Π»Π° ΠΌΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌ ΡΠ»ΡΡΠ°ΠΉ Ρ ΠΏΡΡΡΡΠΌ Π΄Π΅ΡΠ΅Π²ΠΎΠΌ β ΠΏΠ΅ΡΠ°Π»ΡΠ½ΡΠΌ ΠΈ ΠΎΠ΄ΠΈΠ½ΠΎΠΊΠΈΠΌ Π΄Π΅ΡΠ΅Π²ΡΠ΅ΠΌ, Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π½Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²ΡΠ΅Π². ΠΠ½ΠΎ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ Π½Π°ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠΎΠ·Π΄Π°ΡΡΠ΅ΠΉ ΠΌΠΎΠ½ΠΎΠΈΠ΄, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ ΠΏΡΠΎΡΡΠΎ Π³ΠΎΠ²ΠΎΡΠΈΠΌ, ΡΡΠΎ Π΅ΡΠ»ΠΈ Π½Π°ΡΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ ΠΏΡΡΡΠΎ, ΡΠΎ ΠΌΠΎΠ½ΠΎΠΈΠ΄Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅Π²ΡΠ°ΡΠ΅Π½ΠΎ, ΡΠ°Π²Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ mempty.