ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΡΡΠ½ΠΊΡΠΎΡ c
Π€ΡΠ½ΠΊΡΠΎΡΡ Π² ΡΠ·ΡΠΊΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ
Π€ΡΠ½ΠΊΡΠΎΡΡ Π² C++
Π€ΡΠ½ΠΊΡΠΎΡΡ Π² Standart ML
Π‘Π»ΠΎΠΆΠ½ΠΎ ΡΡΠΎΡΠΌΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Ρ ΠΠΠ: ΡΡΠ½ΠΊΡΠΎΡΡ Π² ML ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ±ΡΠΈΠΌΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΠΌΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ². Π ΡΠ΅ΡΠΌΠΈΠ½Π°Ρ ML ΡΡΠ½ΠΊΡΠΎΡΡ ΡΠ²Π»ΡΡΡΡΡ ΡΠ°ΡΡΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ML ΠΈ ΠΎΠ½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°ΡΡ ΡΡΡΡΠΊΡΡΡΡ.
structure LoudPlugin :> Plugin =
struct
fun perform ( ) = print «ΠΠ«ΠΠΠΠΠ―ΠΠ ΠΠΠΠΠΠΠ ΠΠ ΠΠΠΠ!\n»
end ;
structure SilentPlugin :> Plugin =
struct
fun perform ( ) = print «Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ Π·Π°Π΄Π°Π½ΠΈΠ΅ ΡΠΈΡ ΠΎ\n»
end ;
structure LoudPerformer = Performer ( LoudPlugin ) ;
structure SilentPerformer = Performer ( SilentPlugin ) ;
ΠΡΠΎ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, ΡΠ°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ² Standard ML.
Π€ΡΠ½ΠΊΡΠΎΡΡ Π² Haskell
Π€ΡΠ½ΠΊΡΠΎΡΡ Π² Haskell ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅ΠΌ, ΡΠ΅ΠΌ ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π½Π°ΡΡΠΎΡΡΠΈΠ΅ ΡΡΠ½ΠΊΡΠΎΡΡ. Π€ΡΠ½ΠΊΡΠΎΡΡ Haskell ΠΎΡΠ΅Π½Ρ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡΡ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΠ½ΠΊΡΠΎΡΡ ΠΈΠ· ΡΠ΅ΠΎΡΠΈΠΈ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ. Π ΡΠ΅ΠΎΡΠΈΠΈ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ ΡΡΠ½ΠΊΡΠΎΡ F β ΡΡΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡΠΌΠΈ, ΡΠ°ΠΊΠΎΠ΅, ΡΡΠΎ ΡΡΡΡΠΊΡΡΡΠ° ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ ΠΈΠ»ΠΈ, Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΡΡΠΎ Π³ΠΎΠΌΠΎΠΌΠΎΡΡΠΈΠ·ΠΌ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡΠΌΠΈ.
Π Haskell ΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π² Π²ΠΈΠ΄Π΅ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΡΠΈΠΏΠ°,
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ, ΡΡΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ, Π΄ΡΠΌΠ°ΠΉΡΠ΅ ΠΎ fmap ΠΊΠ°ΠΊ ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π² ΠΊΠ°ΠΊΠΎΠΌ-ΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅.
instance Functor [ ] where
fmap = map
ΠΠΎ Π·Π°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Functor Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠΈ ΡΡΡΡΠΊΡΡΡΡ! ΠΠΎΡΡΠΎΠΌΡ Π»ΡΠ±ΠΎΠΉ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΡΠ½ΠΊΡΠΎΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π΅ΡΠ²Π½ΠΎ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡ Π·Π°ΠΊΠΎΠ½Π°ΠΌ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ²Π»ΡΡΡΡΡ ΡΠ°ΡΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ². ΠΡΡΡ Π΄Π²Π° ΠΏΡΠ°Π²ΠΈΠ»Π° fmap :
fmap > fmap (g. h) = fmap g. fmap h
ΠΠ΅ΡΠ²ΠΎΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π³Π»Π°ΡΠΈΡ, ΡΡΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΠΆΠ΄Π΅ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΡΡΡΠ΅ΠΊΡΠ°. ΠΡΠΎΡΠΎΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π³Π»Π°ΡΠΈΡ, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ Π΄Π²ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π½Π°Π΄ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, Π° Π·Π°ΡΠ΅ΠΌ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π²ΡΠΎΡΠΎΠΉ.
ΠΡΡΠ³ΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅Ρ ΠΈΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΡΠΊΠΎ, β ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π°Π΄ Π΄Π΅ΡΠ΅Π²ΡΡΠΌΠΈ. ΠΠΎΠ΄ΡΠΌΠ°ΠΉΡΠ΅ ΠΎ Π΄Π΅ΡΠ΅Π²Π΅, ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ fmap ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌ Π΄Π΅ΡΠ΅Π²Π°, ΡΠΎΡ ΡΠ°Π½ΡΡ ΡΡΡΡΠΊΡΡΡΡ Π΄Π΅ΡΠ΅Π²Π°.
ΠΠ°Π²Π°ΠΉΡΠ΅, Π΄Π»Ρ Π½Π°ΡΠ°Π»Π°, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ Π΄Π΅ΡΠ΅Π²ΠΎ,
data Tree a = Node ( Tree a ) ( Tree a )
| Leaf a
deriving Show
Π ΡΡΠΎΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΡΠΊΠ°Π·Π°Π½ΠΎ, ΡΡΠΎ ΡΠΈΠΏ Tree (Π΄Π΅ΡΠ΅Π²ΠΎ) ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈΠ±ΠΎ Node (Π²Π΅ΡΠ²ΡΡ) ΠΈΠ· Π΄Π²ΡΡ Tree (Π»Π΅Π²ΠΎΠΉ ΠΈ ΠΏΡΠ°Π²ΠΎΠΉ Π²Π΅ΡΠ²ΠΈ) ΠΈΠ»ΠΈ Leaf (Π»ΠΈΡΡΠΎΠΌ). ΠΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ deriving Show ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ Π΄Π΅ΡΠ΅Π²ΠΎ ΡΠ΅ΡΠ΅Π· ΡΡΠ½ΠΊΡΠΈΡ show.
instance Functor Tree where
fmap g ( Leaf v ) = Leaf ( g v )
fmap g ( Node l r ) = Node ( fmap g l ) ( fmap g r )
Π’Π΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΡΠΎΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅ΠΌ, ΠΊΠ°ΠΊ fmap ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ Π΄Π΅ΡΠ΅Π²ΡΡΠΌΠΈ. ΠΠΎΡΡΡΠΎΠΈΠΌ Π΄Π΅ΡΠ΅Π²ΠΎ ΡΠΎ ΡΡΡΠΎΠΊΠΎΠ²ΡΠΌΠΈ ( String ) Π»ΠΈΡΡΡΡΠΌΠΈ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ length Π½Π°Π΄ Π½ΠΈΠΌΠΈ, ΡΡΠΎΠ±Ρ ΡΠ·Π½Π°ΡΡ Π΄Π»ΠΈΠ½Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π»ΠΈΡΡΠ°.
Prelude> let tree = (Node (Node (Leaf Β«helloΒ») (Leaf Β«fooΒ»)) (Leaf Β«baarΒ»))
Prelude> fmap length tree
Node (Node (Leaf 5) (Leaf 3)) (Leaf 4)
ΠΠ΄Π΅ΡΡ Ρ Π½Π°Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ Π΄Π΅ΡΠ΅Π²ΠΎ,
Π ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ length Π½Π°Π΄ Π½ΠΈΠΌ Π΄Π°ΡΡ Π½Π°ΠΌ,
ΠΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠΏΠΎΡΠΎΠ± ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ fmap Π΄Π΅Π»Π°Π΅Ρ β ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ (Π² ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π΅ β ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅Ρ) ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· Β«Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΌΠΈΡΠ°Β» Π² » f ΠΌΠΈΡ».
ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΡΠ½ΠΊΡΠΎΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ½Π΄Π°ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ ΡΠΈΠΏΠ° Π² Haskell ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΠΎΠ½Π°Π΄Ρ, Π°ΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΎΡΡ ΠΈ ΡΡΡΠ΅Π»ΠΊΠΈ β ΡΡΠΎ Π²ΡΡ ΡΡΠ½ΠΊΡΠΎΡΡ. Π― Π±Ρ ΡΠΊΠ°Π·Π°Π», ΡΡΠΎ Haskell Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ ΡΠ°ΠΌ, Π³Π΄Π΅ Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΎΡΡ.
ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΡΠ·Π½Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΎ ΠΊΠ»Π°ΡΡΠ°Ρ ΡΠΈΠΏΠ° Π² Haskell, Π½Π°ΡΠ½ΠΈΡΠ΅ Ρ ΠΏΡΠ΅Π²ΠΎΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ°ΡΡΠΈ Typeclassopedia (Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ ΡΠΎ ΡΡΡ. 17).
Π€ΡΠ½ΠΊΡΠΎΡΡ Π² Prolog
Π, Π½Π°ΠΊΠΎΠ½Π΅Ρ, ΡΡΠ½ΠΊΡΠΎΡΡ Π² Prolog. Π€ΡΠ½ΠΊΡΠΎΡΡ Π² Prolog ΡΠ°ΠΌΡΠ΅ ΠΏΡΠΎΡΡΡΠ΅ ΠΈΠ· Π²ΡΠ΅Ρ . ΠΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ Π΄Π²Π° ΠΏΡΠΈΠΌΠ΅ΡΠ°. ΠΠ΅ΡΠ²ΡΠΉ β ΡΡΠΎ Π°ΡΠΎΠΌ Π² Π½Π°ΡΠ°Π»Π΅ ΡΡΡΡΠΊΡΡΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΠΎΠ·ΡΠΌΡΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅,
ΠΠΎΡ Π²Π°ΠΌ ΠΈ ΡΡΠ½ΠΊΡΠΎΡΡ Π² Prolog.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΡΠ°ΠΊΠΎΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠ΅ΡΠΌΠΈΠ½, ΠΊΠ°ΠΊ Β«ΡΡΠ½ΠΊΡΠΎΡΒ» ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠ½ΠΎΡΠΈΡΡΡΡ ΠΊ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΠΊ ΡΠ°Π·Π½ΡΠΌ Π²Π΅ΡΠ°ΠΌ Π² ΡΠ°Π·Π½ΡΡ ΡΠ·ΡΠΊΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠΎΡΡΠΎΠΌΡ, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΡΠ»ΡΡΠΈΡΠ΅ ΡΠ΅ΡΠΌΠΈΠ½ Β«ΡΡΠ½ΠΊΡΠΎΡΒ», Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ.
Π, ΡΡΡ ΡΠ°ΠΊΠΎΠ΅ Π΄Π΅Π»ΠΎβ¦ ΠΌΠ½Π΅ ΡΡΡ ΡΠΊΠ°Π·Π°Π»ΠΈ, ΡΡΠΎ, ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ, ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ, ΡΡΡ ΡΡΠ°ΡΡΡ Ρ ΠΏΠ΅ΡΠ΅Π²ΡΠ», Π΅ΡΡΡ Π½Π° Ρ
Π°Π±ΡΠ΅ =)
Π Π΅ΡΡ Π³ΠΎΠ²ΠΎΡΡΡ, ΡΡΠΎ ΠΏΠΎ ΡΠ°ΡΡΡ ΠΏΠΎ Prolog Π² ΡΡΠ°ΡΡΠ΅ ΠΎΡΠΈΠ±ΠΎΡΠ½Π°.
Π€ΡΠ½ΠΊΡΠΎΡΡ, ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ, ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ Π°Π΄Π°ΠΏΡΠ΅ΡΡ, Π»ΡΠΌΠ±Π΄Π°-ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΡΡΡΠΏΠ»Π΅Π½ΠΈΠ΅
Π‘ΡΠ°ΡΡΡ ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΎΠ² Π‘++, ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ½ΠΎ Π·Π½Π°ΡΡΠΈΡ /ΠΆΠ΅Π»Π°ΡΡΠΈΡ ΡΠ·Π½Π°ΡΡ STL, Π² ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ, Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π΅Π³ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ². ΠΡΠΎ ΠΊΡΠ°ΡΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ ΠΏΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΠΏΠΎΠ½ΡΡΠΈΡΠΌ, Π² ΠΊΠΎΠ½ΡΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠΏΠΈΡΠΎΠΊ Π»ΠΈΡΠ΅ΡΠ°ΡΡΡΡ Π΄Π»Ρ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠ»Π΅Π½ΠΈΡ Ρ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΎΠΌ.
Π€ΡΠ½ΠΊΡΠΎΡΡ
ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΎΡΠ°:
ΠΠ°Π½Π½ΡΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π΄Π²Π΅ const ΡΡΡΠΎΠΊΠΈ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΡΡΠΈΠ½Ρ Π΅ΡΠ»ΠΈ Π΄Π»ΠΈΠ½Π° ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΌΠ΅Π½ΡΡΠ΅ Π΄Π»ΠΈΠ½Ρ Π²ΡΠΎΡΠΎΠΉ. ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΡΠ΄Π΅Π»Π°ΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ»Π°ΡΡΠ° ΠΏΡΠΈ ΡΠΊΠ°Π·Π°Π½ΠΈΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° Π΄ΠΎΡΡΡΠΏΠ° public Π΄Π»Ρ operator().
Π§Π°ΡΡΠΎ, ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π΄Π΅Π»Π°ΡΡ ΡΠ°Π±Π»ΠΎΠ½Π½ΡΠΌΠΈ Π΄Π»Ρ Π»ΡΡΡΠ΅ΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ΄Π°.
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ Ρ.ΠΊ. ΡΠΈΠΏ T Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ΅Π½, ΡΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π½Π° Π²ΡΡΠΊΠΈΠΉ ΡΠ»ΡΡΠ°ΠΉ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅, ΡΡΠΎΠ±Ρ Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ². ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ°Π±Π»ΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠ²Π½ΠΎ ΠΎΠ±ΡΡΠ²Π»ΡΡΡ ΡΠΈΠΏ Π² ΡΠ³Π»ΠΎΠ²ΡΡ ΡΠΊΠΎΠ±ΠΊΠ°Ρ . ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ°, Π²ΡΡΡΡΠΏΠ°ΡΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ-ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Ρ ΠΊΡΡΠ³Π»ΡΠΌΠΈ ΡΠΊΠΎΠ±ΠΊΠ°ΠΌΠΈ. ΠΡΠ·ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ Π²ΠΎΡ ΡΠ°ΠΊ:
ΠΠ°Π΄ΠΎ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π² ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠΈΠΏΠ° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ operator() Ρ ΡΡΠ½ΠΊΡΠΎΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»ΡΠ±ΠΎΠΉ. Π Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π³ΡΡΠΆΠ΅Π½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° accumulate (ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° Π² ), ΠΊΠΎΡΠΎΡΠ°Ρ ΡΡΠ΅Π±ΡΠ΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΡΡ , ΡΡΠΎ ΠΈ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ Π² ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, Π½ΠΎ Π² Π΄ΡΡΠ³ΠΈΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ ΠΈ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ .
ΠΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ
ΠΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ- ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ², Π² ΠΊΠΎΡΠΎΡΡΡ ΡΠΈΠΏ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ operator() bool. ΠΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π² Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΎΠΊ, ΠΏΠΎΠΈΡΠΊΠ°, Π° ΡΠ°ΠΊΠΆΠ΅ Π²ΠΎ Π²ΡΠ΅Ρ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ , ΠΈΠΌΠ΅ΡΡΠΈΡ Π½Π° ΠΊΠΎΠ½ΡΠ΅ _if. Π‘ΠΌΡΡΠ» Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ-ΡΡΠ½ΠΊΡΠΈΡ Π² ΡΠ»ΡΡΠ°Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΡΡΠΈΠ½Ρ ΠΈΠ»ΠΈ Π»ΠΎΠΆΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ ΡΡΠ»ΠΎΠ²ΠΈΡ. ΠΡΠΎ Π»ΠΈΠ±ΠΎ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ Π½Π΅ΠΊΠΈΡ ΡΠ²ΠΎΠΉΡΡΠ², Π»ΠΈΠ±ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Π΄Π²ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΏΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡ ΠΏΡΠΈΠ·Π½Π°ΠΊΡ.
ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ°:
Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ Π°Π΄Π°ΠΏΡΠ΅ΡΡ
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΠ½Π°ΡΠ½ΡΠ΅ ΠΈ Π±ΠΈΠ½Π°ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ, ΡΠΆΠ΅ Π²ΠΊΠ»ΡΡΠ΅Π½Ρ Π² STL ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ Π΅Π΄Π΅ΡΠ° functional. ΠΡΠ΅ ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡΡΡΡ ΡΠ°Π±Π»ΠΎΠ½Π½ΡΠΌΠΈ ΠΊΠ»Π°ΡΡΠ°ΠΌΠΈ ΠΈ ΡΡΠ΅Π±ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² Π² ΡΠΈΠΏΠ΅ Π΄Π°Π½Π½ΡΡ , Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ. ΠΡΠΈΠΌΠ΅ΡΡ: std::greater<>, std::less<>.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ ΡΠΎΡΡΠΈΡΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΏΠΎ ΡΠ±ΡΠ²Π°Π½ΠΈΡ Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π½Π°ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
ΠΡΠΈΠ½ΡΠΈΠΏ ΡΠ°Π±ΠΎΡΡ std::greater ΡΡ ΠΎΠΆ ΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ:
ΠΠ½ΠΎΠ³Π΄Π°, Π½Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΠ΄ΡΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈΡΡ ΠΎΠ΄Ρ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΡΠ»ΠΎΠ²ΠΈΠΉ, Ρ.Π΅. Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ. Π ΡΠ°ΠΊΠΈΡ ΡΠ»ΡΡΠ°ΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ Π°Π΄Π°ΠΏΡΠ΅ΡΡ. ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΈ ΡΠ°ΠΌΠΈ Π°Π΄Π°ΠΏΡΠ΅ΡΡ ΠΌΠΎΠ³ΡΡ ΡΠ»ΡΠΆΠΈΡΡ ΡΠ°ΡΡΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ Π΄ΡΡΠ³ΠΈΡ Π°Π΄Π°ΠΏΡΠ΅ΡΠΎΠ², Π·Π° ΡΡΠ΅Ρ ΡΠ΅Π³ΠΎ Π΄ΠΎΡΡΠΈΠ³Π°Π΅ΡΡΡ Π³ΠΈΠ±ΠΊΠΎΡΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ. ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ Π°Π΄Π°ΠΏΡΠ΅ΡΡ: bind1st, bind2nd, not1, not2.
ΠΡΠΈΠΌΠ΅Ρ: ΠΏΠΎΠ΄ΡΡΠΈΡΠ°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², Π±ΠΎΠ»ΡΡΠΈΡ (>), ΡΠ΅ΠΌ Π΄Π²Π°.
ΠΠ°Π½Π½ΡΠΉ ΠΊΠΎΠ΄ Π²ΡΠ²Π΅Π΄Π΅Ρ 2. ΠΡΠ΅ Π²Π΅ΡΠ½ΠΎ, Π»ΠΈΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ 3 ΠΈ 5 ΠΏΡΠ΅Π²ΠΎΡΡ ΠΎΠ΄ΡΡ 2.
ΠΡΠΌΠ±Π΄Π°-ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΠ°Π²Π΅ΡΠ½ΠΎΠ΅, ΡΠ°ΠΌΠ°Ρ ΠΏΡΠΈΡΡΠ½Π°Ρ ΡΠ°ΡΡΡ 11 ΡΡΠ°Π½Π΄Π°ΡΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΎΡΠ΅Π½Ρ Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΊΠΎΠ΄ ΠΏΡΡΠΌΠΎ Π½Π° ΠΌΠ΅ΡΡΠ΅, Π½Π΅ ΡΠ°ΡΠΏΠΎΠ»Π·Π°ΡΡΡ ΠΌΡΡΠ»ΡΡ ΠΏΠΎ ΡΠ°Π·Π½ΡΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΌ ΠΊΠ»Π°ΡΡΠ°ΠΌ ΠΈ ΡΡΡΡΠΊΡΡΡΠ°ΠΌ, ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΠΌ Π΄Π»Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ²ΡΡΠ°ΡΡΠ°Ρ ΡΠΈΡΠ°Π΅ΠΌΠΎΡΡΡ ΠΊΠΎΠ΄Π° Π² ΡΠ°Π·Ρ, Π²Π΅Π΄Ρ ΠΊΡΠΈΡΠ΅ΡΠΈΠΉ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°Ρ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΏΡΡΠΌΠΎ ΡΡΠ΄ΠΎΠΌ Ρ ΠΌΠ΅ΡΡΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΡΡΠΎ Π½Π΅ ΠΎΡΠΌΠ΅Π½ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π±ΡΠ»ΠΎ ΠΎΠ·Π²ΡΡΠ΅Π½ΠΎ Π²ΡΡΠ΅, ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈΠΌΠ΅ΡΡ ΠΏΡΠ°Π²ΠΎ Π½Π° ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠ°ΠΌ, Π³Π΄Π΅ ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΈΠ½Π΅ΡΠ΅Ρ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π² ΡΠ΅Π»Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° ΠΌΠ΅ΡΡΠ΅ ΠΏΠΎΠ½ΠΈΠ·ΠΈΡ ΡΠ΄ΠΎΠ±ΠΎΡΠΈΡΠ°Π΅ΠΌΠΎΡΡΡ, ΠΈΠ»ΠΈ Π΅ΡΠ»ΠΈ Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΡ ΠΎΠΆΠΈΠ΅ ΠΊΡΡΠΊΠΈ ΠΊΠΎΠ΄Π° ΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ Π²ΡΠ½Π΅ΡΡΠΈ ΠΎΠ±ΡΠΈΠΉ Π² ΠΎΠ΄Π½ΠΎ ΠΌΠ΅ΡΡΠΎ. Π ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ»ΡΡΠ°ΡΡ , Π΄Π°Π½Π½Π°Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ Π±ΡΠ΄Π΅Ρ ΠΎΡΠ΅Π½Ρ ΡΠ΄ΠΎΠ±Π½Π°. ΠΠ½Π° ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠΎΠ½ΠΊΠΎΡΡΠ΅ΠΉ, ΠΌΡ Π»ΠΈΡΡ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΎΠ±ΡΠ΅Π΅ Ρ Π½Π΅ΠΉ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠ»Π΅Π½ΠΈΠ΅, Ρ.ΠΊ. ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π²ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΎ Π±Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ°ΡΡΠΈ. Π― ΠΏΠΎΠΊΠ°ΠΆΡ Π»ΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΉ Ρ Π»ΡΠΌΠ±Π΄Π°-ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ, ΠΈ Π²Ρ ΠΏΠΎΠΉΠΌΠ΅ΡΠ΅, ΠΏΠΎΡΠ΅ΠΌΡ Π΅Ρ ΡΠ°ΠΊ ΠΏΠΎΠ»ΡΠ±ΠΈΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ.
ΠΡΠΈΠΌΠ΅Ρ: Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΡΡΠΈΡΠ°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½Π΅ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΊΡΠ°ΡΠ½ΡΡ 7
ΠΈ Π΅ΡΡΡ Π½Π°ΡΠ° Π»ΡΠΌΠ±Π΄Π°-ΡΡΠ½ΠΊΡΠΈΡ.
ΠΠ»ΠΈ ΠΆΠ΅ Π΄ΡΡΠ³ΠΎΠΉ: Π²ΡΠ²Π΅ΡΡΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΏΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡΡ ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π½Π° ΡΠΊΡΠ°Π½.
ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π² Π»ΡΠΌΠ±Π΄Π°-ΡΡΠ½ΠΊΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ ΠΊΠ°ΠΊ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΡΠ°ΠΊ ΠΈ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅. ΠΠΎ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ, Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΡΡΠΈΡΠ°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΊΡΠ°ΡΠ½ΡΡ Π½Π΅ΠΊΠΎΠ΅ΠΌΡ ΡΠΈΡΠ»Ρ k, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²Π²Π΅Π΄Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ? ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΏΠΈΡΠΎΠΊ Π·Π°Ρ Π²Π°ΡΠ°, ΠΎΠ½ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΠΊΠ²Π°Π΄ΡΠ°ΡΠ½ΡΡ ΡΠΊΠΎΠ±ΠΊΠ°Ρ , Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΡΡΡΡΡ ΡΠ΅ΡΠ΅Π· Π·Π°ΠΏΡΡΡΡ. ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ΄ΡΠΈ ΡΠ°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΡΠ°ΠΊ ΠΈ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅.
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΠΎΠ΄ΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΊΡΠ°ΡΠ½ΡΡ k ΠΈ Π±ΠΎΠ»ΡΡΠΈΡ , ΡΠ΅ΠΌ m.
ΠΡΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΈ Π»Π°ΠΊΠΎΠ½ΠΈΡΠ½ΠΎ, Π° Π³Π»Π°Π²Π½ΠΎΠ΅, ΡΠΈΡΠ°Π΅ΠΌΠΎΡΡΡ ΠΊΠΎΠ΄Π° Π²ΠΎΠ·ΡΠ°ΡΡΠ°Π΅Ρ Π² ΡΠ°Π·Ρ. Π’Π΅ΠΏΠ΅ΡΡ Ρ ΠΏΠΎΠΊΠ°ΠΆΡ ΠΏΡΠΈΠΌΠ΅Ρ, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅.
ΠΡΠΈΠΌΠ΅Ρ: ΠΏΠΎΠ΄ΡΡΠΈΡΠ°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΡΠ½ΡΡ , ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠ²Π΅ΡΡΠΈ Π½Π° ΡΠΊΡΠ°Π½. ΠΠ»Ρ ΠΏΡΠΎΡΡΠΎΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌ for_each.
ΠΠΎΠ΄Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈΡΠΎΠ³ΠΎΠ²
ΠΠΎΠΌΠ°Π½Π΄Π° Π² Ubuntu Π΄Π»Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ gcc:
ΠΠΈΡΠ΅ΡΠ°ΡΡΡΠ°
ΠΡΠ»ΠΈ ΠΠ°ΠΌ ΠΏΠΎΠ½ΡΠ°Π²ΠΈΠ»Π°ΡΡ ΡΡΠ°ΡΡΡ, ΠΏΡΠΎΠ³ΠΎΠ»ΠΎΡΡΠΉΡΠ΅ Π·Π° Π½Π΅Π΅
ΠΠΎΠ»ΠΎΡΠΎΠ²: 15 ΠΠΎΠ»ΠΎΡΠΎΠ²Π°ΡΡ
Π€ΡΠ½ΠΊΡΠΎΡΡ (Π³Π»Π°Π²Π° ΠΊΠ½ΠΈΠ³ΠΈ Β«Π’Π΅ΠΎΡΠΈΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ Π΄Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΎΠ²Β»)
ΠΡΠΎ ΡΠ΅Π΄ΡΠΌΠ°Ρ ΡΡΠ°ΡΡΡ ΠΈΠ· ΡΠΈΠΊΠ»Π° Β«Π’Π΅ΠΎΡΠΈΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ Π΄Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΎΠ²Β». ΠΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅ ΡΡΠ°ΡΡΠΈ ΡΠΆΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈΡΡ Π½Π° Π₯Π°Π±ΡΠ΅:
Π€ΡΠ½ΠΊΡΠΎΡΡ
ΠΠ° ΠΏΠΎΠ½ΡΡΠΈΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΎΡΠ° ΡΡΠΎΠΈΡ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠ°Ρ, Π½ΠΎ ΠΌΠΎΡΠ½Π°Ρ ΠΈΠ΄Π΅Ρ (ΠΊΠ°ΠΊ Π±Ρ Π·Π°Π΅Π·ΠΆΠ΅Π½ΠΎ ΡΡΠΎ Π½ΠΈ ΠΏΡΠΎΠ·Π²ΡΡΠ°Π»ΠΎ). ΠΡΠΎΡΡΠΎ ΡΠ΅ΠΎΡΠΈΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ ΠΏΠΎΠ»Π½Π° ΠΏΡΠΎΡΡΡΡ ΠΈ ΠΌΠΎΡΠ½ΡΡ ΠΈΠ΄Π΅ΠΉ. Π€ΡΠ½ΠΊΡΠΎΡ Π΅ΡΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡΠΌΠΈ. ΠΡΡΡΡ Π΄Π°Π½Ρ Π΄Π²Π΅ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ C ΠΈ D, Π° ΡΡΠ½ΠΊΡΠΎΡ F ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈΠ· C Π² ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈΠ· D β ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π½Π°Π΄ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ. ΠΡΠ»ΠΈ a β ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠ· C, ΡΠΎ Π±ΡΠ΄Π΅ΠΌ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°ΡΡ Π΅Π³ΠΎ ΠΎΠ±ΡΠ°Π· ΠΈΠ· D ΠΊΠ°ΠΊ F a (Π±Π΅Π· ΡΠΊΠΎΠ±ΠΎΠΊ). ΠΠΎ Π²Π΅Π΄Ρ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ β ΡΡΠΎ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΡ, Π½ΠΎ Π΅ΡΠ΅ ΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡΡΠΈΠ΅ ΠΈΡ ΠΌΠΎΡΡΠΈΠ·ΠΌΡ. Π€ΡΠ½ΠΊΡΠΎΡ ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΠΈ ΠΌΠΎΡΡΠΈΠ·ΠΌΡ β ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π½Π°Π΄ ΠΌΠΎΡΡΠΈΠ·ΠΌΠ°ΠΌΠΈ. ΠΠΎ ΠΌΠΎΡΡΠΈΠ·ΠΌΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π½Π΅ ΠΊΠ°ΠΊ ΠΏΠΎΠΏΠ°Π»ΠΎ, Π° ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΡΠ²ΡΠ·ΠΈ. Π ΠΈΠΌΠ΅Π½Π½ΠΎ, Π΅ΡΠ»ΠΈ ΠΌΠΎΡΡΠΈΠ·ΠΌ f ΠΈΠ· C ΡΠ²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ a Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ b,
ΡΠΎ ΠΎΠ±ΡΠ°Π· f Π² D, F f, ΡΠ²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΎΠ±ΡΠ°Π· a Ρ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ b:
(ΠΠ°Π΄Π΅Π΅ΠΌΡΡ, ΡΡΠΎ ΡΠ°ΠΊΠ°Ρ ΡΠΌΠ΅ΡΡ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° Haskell ΠΏΠΎΠ½ΡΡΠ½Π° ΡΠΈΡΠ°ΡΠ΅Π»Ρ. ΠΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΈΡΠ°ΡΡ ΡΠΊΠΎΠ±ΠΊΠΈ, ΠΏΡΠΈΠΌΠ΅Π½ΡΡ ΡΡΠ½ΠΊΡΠΎΡΡ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ ΠΈΠ»ΠΈ ΠΌΠΎΡΡΠΈΠ·ΠΌΠ°ΠΌ.)
ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠ½ΠΊΡΠΎΡ ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΡΡΡΡΠΊΡΡΡΡ: ΡΡΠΎ Π±ΡΠ»ΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Π²ΠΎ Π²Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ, Π±ΡΠ΄Π΅Ρ ΡΠ²ΡΠ·Π°Π½ΠΎ ΠΈ Π² Π²ΡΡ ΠΎΠ΄Π½ΠΎΠΉ. ΠΠΎ ΡΡΠΈΠΌ ΡΡΡΡΠΊΡΡΡΠ° Π½Π΅ ΠΈΡΡΠ΅ΡΠΏΡΠ²Π°Π΅ΡΡΡ: Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠ°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΌΠΎΡΡΠΈΠ·ΠΌΠΎΠ². ΠΡΠ»ΠΈ h β ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ f ΠΈ g :
ΡΠΎ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΠΌ, ΡΡΠΎΠ±Ρ Π΅Π³ΠΎ ΠΎΠ±ΡΠ°Π· ΠΏΠΎΠ΄ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΠΌ F Π±ΡΠ» ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΠ΅ΠΉ ΠΎΠ±ΡΠ°Π·ΠΎΠ² f ΠΈ g:
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΠΌ, ΡΡΠΎΠ±Ρ Π²ΡΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΡΠ΅(ΡΠΎΠΆΠ΄Π΅ΡΡΠ²Π΅Π½Π½ΡΠ΅) ΠΌΠΎΡΡΠΈΠ·ΠΌΡ ΠΈΠ· C ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π»ΠΈΡΡ Π² Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΡΠ΅ ΠΌΠΎΡΡΠΈΠ·ΠΌΡ ΠΈΠ· D:
ΠΠ΄Π΅ΡΡ ida β ΡΡΠΎ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΡΠΉ ΠΌΠΎΡΡΠΈΠ·ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ° a, Π° idF a β Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΡΠΉ ΠΌΠΎΡΡΠΈΠ·ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ° F a.
ΠΠ°ΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ Π²ΡΠ΅ ΡΡΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡ ΠΊΡΡΠ³ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΌΠΎΡΡΠΈΠ·ΠΌΠΎΠ². Π€ΡΠ½ΠΊΡΠΎΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΡΡΡΡΠΊΡΡΡΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ. ΠΡΠ»ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ ΡΠ΅Π±Π΅ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ ΠΊΠ°ΠΊ Π½Π°Π±ΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΠΏΠ΅ΡΠ΅ΠΏΠ»Π΅ΡΠ΅Π½Π½ΡΡ ΠΌΠΎΡΡΠΈΠ·ΠΌΠ°ΠΌΠΈ, ΡΠΎ ΡΡΠ½ΠΊΡΠΎΡ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΠ°Π²Π° ΠΎΠ±ΠΎΡΠ²Π°ΡΡ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Π½ΠΈΡΠΈ ΡΡΠΎΠ³ΠΎ ΠΊΡΡΠΆΠ΅Π²Π°. ΠΠ½ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΡΠΊΠ»Π΅ΠΈΡΡ ΠΌΠΎΡΡΠΈΠ·ΠΌΡ Π² ΠΎΠ΄ΠΈΠ½, Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡΠ°Π·ΡΡΠ²Π°Π΅Ρ ΡΠ²ΡΠ·Π΅ΠΉ. ΠΡΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΏΠΎΠ½ΡΡΠΈΡ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΡΡΠΈ ΠΈΠ· ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°. Π ΡΡΠΎΠΌ ΡΠΌΡΡΠ»Π΅ ΡΡΠ½ΠΊΡΠΎΡΡ «Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½Ρ» (Ρ ΠΎΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π΅ΡΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΠ΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΡΡΠΈ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ²). ΠΠ°ΠΊ ΠΈ Π»ΡΠ±Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΡΡΠ½ΠΊΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈ ΡΠΊΠ»Π΅ΠΈΠ²Π°ΡΡΠΈΠΌΠΈ, ΠΈ Π²ΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡΠΈΠΌΠΈ. ΠΡΠΏΠ΅ΠΊΡ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΡΠΊΠΎ ΠΏΡΠΎΡΠ²Π»ΡΠ΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΈΡΡ ΠΎΠ΄Π½Π°Ρ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π½ΡΡΠ΅ ΡΠ΅Π»Π΅Π²ΠΎΠΉ. Π ΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΡΡ ΠΎΠ΄Π½Π°Ρ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ 1, ΡΠΎΡΡΠΎΡΡΡΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ (Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΠΎΠ³ΠΎ) ΠΌΠΎΡΡΠΈΠ·ΠΌΠ°. Π€ΡΠ½ΠΊΡΠΎΡ ΠΈΠ· ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ 1 Π² Π»ΡΠ±ΡΡ Π΄ΡΡΠ³ΡΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ ΠΏΡΠΎΡΡΠΎ Π²ΡΠ±ΠΈΡΠ°Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠ· ΡΡΠΎΠΉ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ. ΠΠΌΠ΅Π΅Ρ ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΠ»Π½Π°Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ Ρ ΠΌΠΎΡΡΠΈΠ·ΠΌΠ°ΠΌΠΈ ΠΈΠ· ΡΠΈΠ½Π³Π»ΡΠΎΠ½Π°, Π²ΡΠ±ΠΈΡΠ°ΡΡΠΈΠΌΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈΠ· ΡΠ΅Π»Π΅Π²ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ². ΠΡΠΏΠ΅ΠΊΡ ΡΠΊΠ»Π΅ΠΈΠ²Π°Π½ΠΈΡ, Π΄ΠΎΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π΄ΠΎ Π°Π±ΡΡΡΠ΄Π°, Π½Π°Π±Π»ΡΠ΄Π°Π΅ΡΡΡ Π² ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠΌ ΡΡΠ½ΠΊΡΠΎΡΠ΅ Ξc. ΠΠ½ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ c ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ, Π° Π²ΡΡΠΊΠΈΠΉ ΠΌΠΎΡΡΠΈΠ·ΠΌ β Π² Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΡΠΉ ΠΌΠΎΡΡΠΈΠ·ΠΌ idc. ΠΡΠΎ ΠΊΠ°ΠΊ ΡΠ΅ΡΠ½Π°Ρ Π΄ΡΡΠ°, Π·Π°ΡΠ°ΡΡΠ²Π°ΡΡΠ°Ρ Π²ΡΠ΅ Π² ΡΠΎΡΠΊΡ ΡΠΈΠ½Π³ΡΠ»ΡΡΠ½ΠΎΡΡΠΈ. ΠΡ Π²Π΅ΡΠ½Π΅ΠΌΡΡ ΠΊ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΎΡΠ° ΠΏΡΠΈ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠΈ ΠΏΡΠ΅Π΄Π΅Π»ΠΎΠ² ΠΈ ΠΊΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΎΠ².
Π€ΡΠ½ΠΊΡΠΎΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ
ΠΠ΅ΡΠ½ΡΠΌΡΡ Π½Π° Π·Π΅ΠΌΠ»Ρ, Π² ΠΌΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΡΠ°ΠΊ, Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ ΡΠΈΠΏΠΎΠ² ΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΎΡΡ, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΠΈΠ΅ ΡΡΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ Π² ΡΠ΅Π±Ρ β ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠ΅ ΡΠ½Π΄ΠΎΡΡΠ½ΠΊΡΠΎΡΡ. Π§ΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠ½Π΄ΠΎΡΡΠ½ΠΊΡΠΎΡ Π² ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ ΡΠΈΠΏΠΎΠ²? Π ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΎΠ½ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΠ΄Π½ΠΈΠΌ ΡΠΈΠΏΠ°ΠΌ Π΄ΡΡΠ³ΠΈΠ΅. ΠΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π½Π°ΠΌ Π·Π½Π°ΠΊΠΎΠΌΡ, ΡΡΠΎ ΡΠΈΠΏΡ, ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ².
Π€ΡΠ½ΠΊΡΠΎΡ Maybe
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Maybe Π΅ΡΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° a Π² ΡΠΈΠΏ Maybe a:
Π‘Π»Π΅Π΄ΡΡ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ Π²ΡΡΠ΅, Π΄Π°Π΄ΠΈΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ fmap Π΄Π»Ρ Maybe :
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΈΠΏΠΎΠ² Maybe Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ fmap ΡΠΎΡΡΠ°Π²Π»ΡΡΡ ΡΡΠ½ΠΊΡΠΎΡ, ΠΎΡΡΠ°Π»ΠΎΡΡ Π΄ΠΎΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ fmap ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΡΠ΅ ΠΌΠΎΡΡΠΈΠ·ΠΌΡ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ. ΠΡΠΈ ΡΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ Π½Π°Π·ΡΠ²Π°ΡΡΡΡ «ΡΡΠ½ΠΊΡΠΎΡΠΈΠ°Π»ΡΠ½ΡΠΌΠΈ Π·Π°ΠΊΠΎΠ½Π°ΠΌΠΈ», Π½ΠΎ ΠΎΠ½ΠΈ ΠΏΡΠΎΡΡΠΎ ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΡΡ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ.
ΠΠ΅ΡΠΎΠ΄ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠΉ
ΠΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΎΡΠΈΠ°Π»ΡΠ½ΡΠ΅ Π·Π°ΠΊΠΎΠ½Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΠΏΠΈΡΠ½ΠΎΠΉ ΡΠ΅Ρ Π½ΠΈΠΊΠΎΠΉ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ² Π² Haskell. ΠΠ΅ΡΠΎΠ΄ ΠΎΠΏΠΈΡΠ°Π΅ΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ Π² Haskell ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π½Π°Π±ΠΎΡΠΎΠΌ ΡΠ°Π²Π΅Π½ΡΡΠ²: Π»Π΅Π²Π°Ρ ΡΠ°ΡΡΡ ΡΠ°Π²Π½Π° ΠΏΡΠ°Π²ΠΎΠΉ, ΠΎΠ±Π΅ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»Π΅Π½Ρ Π΄ΡΡΠ³ Π²ΠΌΠ΅ΡΡΠΎ Π΄ΡΡΠ³Π° (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡΠΈ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ²). ΠΠΎΠΆΠ½ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΡΡΠ°Π²ΠΈΡΡ ΡΠ΅Π»ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΌΠ΅ΡΡΠΎ Π΅Π΅ Π²ΡΠ·ΠΎΠ²Π° (ΠΈΠ½Π»Π°ΠΉΠ½ΠΈΠ½Π³), ΡΠ°ΠΊ ΠΈ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΌΠ΅ΡΡΠΎ Π΅Π΅ ΡΠ΅Π»Π° (ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³). Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠΎΠΆΠ΄Π΅ΡΡΠ²Π΅Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ:
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΡΡΠΎ fmap ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ:
ΠΠ°ΡΠ½ΡΠΌ ΡΠΎ ΡΠ»ΡΡΠ°Ρ Nothing :
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΈΡΠ»ΠΎ Π²ΡΠ΅ΠΌΡ Just :
Π‘ΡΠΎΠΈΡ ΠΏΠΎΠ΄ΡΠ΅ΡΠΊΠ½ΡΡΡ, ΡΡΠΎ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΉ Ρ ΠΏΠΎΠ±ΠΎΡΠ½ΡΠΌΠΈ ΡΡΡΠ΅ΠΊΡΠ°ΠΌΠΈ Π² ΡΡΠΈΠ»Π΅ Π‘++, ΠΌΠ΅ΡΠΎΠ΄ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠΉ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ:
ΠΠ΅ΡΠΎΠ΄ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» Π±Ρ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ square ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎ, ΡΠ°ΠΊΠ°Ρ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½Π° ΠΈ ΠΌΠ΅Π½ΡΠ΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ. ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΡΠΎ, Π΅ΡΠ»ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ square ΠΊΠ°ΠΊ ΠΌΠ°ΠΊΡΠΎΡ, ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ C++ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠΉ Ρ ΠΊΠ°ΡΠ°ΡΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ.
Π‘Π½ΠΎΠ²Π° Maybe
ΠΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΡΡΠ΅Π³ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ°, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΊΠ°ΠΊ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ. Π Π²ΠΎΡ Π΄ΡΡΠ³ΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ, Π±Π΅Π· ΠΊΠ°ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ:
ΠΠ»Π°ΡΡΡ ΡΠΈΠΏΠΎΠ²
ΠΠ°ΠΊ ΠΆΠ΅ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡ ΡΡΠ½ΠΊΡΠΎΡΠ° ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² Haskell? ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΊΠ»Π°ΡΡΠΎΠ² ΡΠΈΠΏΠΎΠ². ΠΠ»Π°ΡΡ ΡΠΈΠΏΠΎΠ² Π·Π°Π΄Π°ΡΡ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²ΠΎ ΡΠΈΠΏΠΎΠ², ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΡ Π΅Π΄ΠΈΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. Π ΠΏΡΠΈΠΌΠ΅ΡΡ, ΠΊΠ»Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΡΡΠ°Π²Π½ΠΈΠΌΡΡ Π½Π° ΡΠ°Π²Π΅Π½ΡΡΠ²ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΊ:
ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠ°Π²Π΅Π½ΡΡΠ²ΠΎ ΡΠΎΡΠ΅ΠΊ:
Π€ΡΠ½ΠΊΡΠΎΡΡ Π² C++
ΠΠΎ ΠΊΠ°ΠΊ Π½Π°ΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΡΠ°Π±Π»ΠΎΠ½ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ²? Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΡΠ°ΡΡΠΈΡΠ½Π°Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ°Π±Π»ΠΎΠ½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ C++ Π·Π°ΠΏΡΠ΅ΡΠ΅Π½Π°. ΠΠ΅Π»ΡΠ·Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ:
ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ Π²Π΅ΡΠ½ΡΡΡΡΡ ΠΊ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ ΠΊ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ fmap (Π±Π΅Π· ΠΊΠ°ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ):
ΠΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π½ΠΎ Π΄Π»Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ. ΠΠΎΠ»Π΅Π΅ ΠΎΠ±ΡΠ΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ fmap ΠΏΡΠΎΡΡΠΎ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ.
Π€ΡΠ½ΠΊΡΠΎΡ List
ΠΠ»Ρ Π»ΡΡΡΠ΅Π³ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ Π·Π½Π°ΡΠΈΠΌΠΎΡΡΠΈ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ² Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΠΎΠΈΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ². ΠΡΠ±ΠΎΠΉ ΡΠΈΠΏ, ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΡΠ΅ΠΌΡΠΉ Π΄ΡΡΠ³ΠΈΠΌ ΡΠΈΠΏΠΎΠΌ β ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ Π½Π° ΡΠΎΠ»Ρ ΡΡΠ½ΠΊΡΠΎΡΠ°. Π ΠΏΡΠΈΠΌΠ΅ΡΡ, ΠΎΠ±ΠΎΠ±ΡΡΠ½Π½ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΡΡΡΡΡ ΡΠΈΠΏΠΎΠΌ ΡΠ²ΠΎΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΏΠΈΡΠΎΠΊ, ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ:
Π‘ Π΅Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ, ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΡ, Π²ΠΎΠ·Π²Π΅ΡΡΠΈ Π² ΠΊΠ²Π°Π΄ΡΠ°Ρ ΡΡΠ΄ ΡΠΈΡΠ΅Π»:
Π€ΡΠ½ΠΊΡΠΎΡ Reader
ΠΠ°ΠΊ ΠΈ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠΈΠΏΠΎΠ²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΡΠ°ΡΡΠΈΡΠ½ΠΎ. Π ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π΄Π°ΡΠΌ ΡΡΡΠ΅Π»ΠΊΠ΅ ΠΎΠ΄ΠΈΠ½ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, ΠΎΠ½Π° Π²ΡΡ Π΅ΡΡ ΠΆΠ΄ΡΡ Π΄ΡΡΠ³ΠΎΠΉ. Π’ΠΎ Π΅ΡΡΡ,
Π‘ΡΠ°Π±ΠΎΡΠ°Π»ΠΎ! ΠΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡ ΠΌΠΎΠΆΠ΅Ρ Π΅ΡΡ ΡΠΎΠΊΡΠ°ΡΠΈΡΡ Π·Π°ΠΏΠΈΡΡ, Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π²ΡΠΈΡΡ ΠΏΡΠ΅ΡΠΈΠΊΡΠ½ΠΎΠΉ ΡΠΎΡΠΌΠΎΠΉ:
ΡΠ΅ΠΏΠ΅ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΡΡΠΈΡΡ, ΠΏΠΎΠ»ΡΡΠ°Ρ ΠΎΡΠΎΠΆΠ΄Π΅ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ Π΄Π²ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ:
ΠΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΡΠΈΠΏΠΎΠ² (->) r ΠΈ ΡΠ°ΠΊΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ fmap Π½Π°Π·ΡΠ²Π°ΡΡ «reader».
Π€ΡΠ½ΠΊΡΠΎΡΡ ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ
ΠΡ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠ»ΠΈΡΡ Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ² Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² ΠΎΠ±ΡΠ΅Π³ΠΎ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΈΠ»ΠΈ Ρ ΠΎΡΡ Π±Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΡ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, ΠΊΠΎΡΠΎΡΡΠΌ ΡΡΠ½ΠΊΡΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½. Π€ΡΠ½ΠΊΡΠΎΡ reader ΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ Π½Π΅ Π΄ΡΠΌΠ°Π΅ΠΌ ΠΎ ΡΡΠ½ΠΊΡΠΈΡΡ ΠΊΠ°ΠΊ ΠΎ Π΄Π°Π½Π½ΡΡ . ΠΠΎ ΠΊΠ°ΠΊ ΠΌΡ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊ ΡΡΠ½ΠΊΡΠΈΡΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠ° ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊ ΠΏΠΎΠΈΡΠΊΡ Π² ΡΠ°Π±Π»ΠΈΡΠ΅. Π’Π°Π±Π»ΠΈΡΠ° ΡΡΠΎ ΡΠΆΠ΅ Π΄Π°Π½Π½ΡΠ΅. Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Haskell Π»Π΅Π½ΠΈΠ², ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π²ΡΠΎΠ΄Π΅ ΡΠΏΠΈΡΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ Π½Π° Π΄Π΅Π»Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡ. ΠΠΎΡΠΌΠΎΡΡΠΈΡΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π° Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ Π½Π°ΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΠΈΡΠ΅Π», ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°ΡΡ ΡΠ°ΠΊ:
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π°Ρ ΡΡΠ½ΠΊΡΠΎΡ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅Ρ ΡΠ²ΠΎΠΉ ΡΠΈΠΏΠΎΠ²ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, Π±ΡΠ΄Π΅Ρ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ fmap ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, β ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ ΠΊ ΡΠ΅ΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ:
Π C++ ΡΡΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°Π³Π»ΡΠ΄Π½Π΅Π΅ (Π²ΠΎΡ ΡΠΆ Π½Π΅ Π΄ΡΠΌΠ°Π», ΡΡΠΎ ΡΠΊΠ°ΠΆΡ ΡΠ°ΠΊΠΎΠ΅!), Π·Π° ΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠΊΠΎΠ³ΠΎ ΡΠ°Π·Π»ΠΈΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈΠΏΠΎΠ²ΡΠΌΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ, ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΌΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΡΡΠ°Π½Π½ΡΠΉ Π²ΠΈΠ΄, ΡΡΠ½ΠΊΡΠΎΡ Const ΠΈΠ³ΡΠ°Π΅Ρ Π²Π°ΠΆΠ½ΡΡ ΡΠΎΠ»Ρ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡΡ . Π ΡΠ΅ΠΎΡΠΈΠΈ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ ΡΡΠΎ ΡΠ°ΡΡΠ½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ ΡΡΠ½ΠΊΡΠΎΡΠ° Ξc, ΡΠΏΠΎΠΌΡΠ½ΡΡΠΎΠ³ΠΎ ΡΠ°Π½Π΅Π΅ β ΡΠ½Π΄ΠΎΡΡΠ½ΠΊΡΠΎΡΠ½ΠΎΠΉ ΡΠ°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡΠΈ ΡΡΡΠ½ΠΎΠΉ Π΄ΡΡΡ. Π Π±ΡΠ΄ΡΡΠ΅ΠΌ ΠΌΡ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠΌΡΡ Ρ Π½ΠΈΠΌ ΠΏΠΎΠ±Π»ΠΈΠΆΠ΅.
ΠΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ²
ΠΠ΅ΡΠ»ΠΎΠΆΠ½ΠΎ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°ΠΌΠΈ. ΠΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ Π΄Π²ΡΡ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ², ΠΏΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΈ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡΡ, Π΅ΡΡΡ ΠΏΡΠΎΡΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΠΌ Π½Π° ΠΌΠΎΡΡΠΈΠ·ΠΌΡ. ΠΠΎΡΠ»Π΅ ΠΏΡΡΠΆΠΊΠ° Π²Π΄ΠΎΠ»Ρ Π΄Π²ΡΡ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ², Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΡΠ΅ ΠΌΠΎΡΡΠΈΠ·ΠΌΡ ΠΎΡΡΠ°ΡΡΡΡ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΡΠΌΠΈ, ΡΠ°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΌΠΎΡΡΠΈΠ·ΠΌΠΎΠ² ΠΎΡΡΠ°ΡΡΡΡ ΡΠ°ΠΊΠΎΠ²ΠΎΠΉ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π·ΠΎΠ². ΠΠΈΡΠ΅Π³ΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΠ³ΠΎ. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, Π»Π΅Π³ΠΊΠΎ ΡΠΎΡΠ΅ΡΠ°ΡΡΡΡ ΡΠ½Π΄ΠΎΡΡΠ½ΠΊΡΠΎΡΡ. ΠΠΎΠΌΠ½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ maybeTail (ΠΠ: ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ Π³Π»Π°Π²Ρ)? ΠΠ°Π²Π°ΠΉΡΠ΅ Π΅Ρ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ΅ΠΌ, ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΊ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌ ΡΠΏΠΈΡΠΊΠ°ΠΌ Haskell:
ΠΠΎ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ ΠΎ fmap ΠΌΠΎΠΆΠ½ΠΎ Π΄ΡΠΌΠ°ΡΡ ΠΊΠ°ΠΊ ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°:
ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΡΠΈΠΏΠ°
ΠΠ°ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ²ΡΠΉ fmap Π±Π΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΠ²ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΡ
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ½ΠΎΡΡΠΈ
ΠΠ΅ΡΡΠΎΠΌ ΠΠ°Π·Π΅ΡΠΌΠ°Π½ Π»ΡΠ±Π΅Π·Π½ΠΎ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ ΡΠ΅ΡΠ΅Π½Π·ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠ°. ΠΠ²ΡΠΎΡ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ Π΅ΠΌΡ Π·Π° ΡΠ΅ΡΠΏΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΡΡΠΊΠ°Π·Π°Π½Π½ΡΠ΅ ΠΈΠ΄Π΅ΠΈ.
leshabirukov: ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠ΅ΡΠ²Π°Ρ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° Π³Π»Π°Π²Ρ ΠΏΠ΅ΡΠ΅Π²Π΅Π΄Π΅Π½Π° ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΌΠ½ΠΎΡ ΠΈ Bodigrim, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΠΊΠΆΠ΅ ΡΡΠ°ΡΡΠ²ΠΎΠ²Π°Π» Π² ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ. ΠΠ΅ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ Π½Π°ΡΠ΅Π³ΠΎ ΡΡΡΠ΄Π° Π»Π΅ΠΆΠΈΡ Π½Π° ΠΌΠΎΠ΅ΠΉ ΡΠΎΠ²Π΅ΡΡΠΈ.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΡΡΠ½ΠΊΡΠΎΡ c
Π‘ΠΎΠ²Π΅Ρ 38. ΠΡΠΎΠ΅ΠΊΡΠΈΡΡΠΉΡΠ΅ ΠΊΠ»Π°ΡΡΡ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ² Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
ΠΠΈ C, Π½ΠΈ C++ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Π΄ΡΡΠ³ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ qsort Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
void qsort(void *base, size_t nmemb, size_t size,
int (*cmpfcn)(const void*, const void*));
Function // ΠΠΎΠ·Π²ΡΠ°Ρ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
for_each(InputIterator first, InputIterator last,
Function f);// ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
Π§Π΅ΡΡΠ½ΠΎ Π³ΠΎΠ²ΠΎΡΡ, ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π° ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΠ·ΡΠ²Π°ΡΡΠ°Ρ ΡΡΠΎΡΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ ΡΠ²Π½ΠΎ Π·Π°Π΄Π°ΡΡ ΡΠΈΠΏΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Π² ΡΠΎΡΠΊΠ΅ Π²ΡΠ·ΠΎΠ²Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ΅ for_each ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΎΡΡ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅:
void operator()(int x) <β¦>// Π² ΡΠΎΠ²Π΅ΡΠ΅ 40
typedef deque ::iterator DequeIntIter; // ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅
DoSomething d; // Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΡΠ½ΠΊΡΠΈΠΈ
DoSomethng&>(di.begin(), // ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² DequeIntIter
di.end(), // ΠΈ DoSomething&; Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅
d); // ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ°
// ΠΈ Π²ΠΎΠ·Π²ΡΠ°Ρ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅.
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ STL ΠΏΠΎΡΡΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ, Π° Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² STL ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΉ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΡΡΡΡ. Π ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΡΠΎΠ²Π΅ΡΠ° Π±ΡΠ΄Π΅ΠΌ ΡΡΠΈΡΠ°ΡΡ, ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π²ΡΠ΅Π³Π΄Π° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΡΡΠΎ ΠΏΠΎΡΡΠΈ Π²ΡΠ΅Π³Π΄Π° ΡΠ°ΠΊ.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠ·Π°Π±ΠΎΡΠΈΡΡΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π» ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ (ΡΠΎ Π΅ΡΡΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ). ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ Π΄Π²ΡΡ ΡΡΠ»ΠΎΠ²ΠΈΠΉ. ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ, Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠΉΠ΄Π΅ΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π΄ΠΎΡΠΎΠ³ΠΎ. ΠΠΎ-Π²ΡΠΎΡΡΡ , ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΌΠΎΠ½ΠΎΠΌΠΎΡΡΠ½ΡΠΌΠΈ (ΡΠΎ Π΅ΡΡΡ Π½Π΅ ΠΏΠΎΠ»ΠΈΠΌΠΎΡΡΠ½ΡΠΌΠΈ), ΠΏΠΎΡΡΠΎΠΌΡ Π² Π½ΠΈΡ Π½Π΅ ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΡΠΎΡΠΎΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°Ρ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΎΡΡΠ΅ΡΠ΅Π½ΠΈΠ΅: Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ΄Π°Π»ΡΡΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΠ΅ (Π΄ΡΡΠ³ΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΎΡΡΠ΅ΡΠ΅Π½ΠΈΡ Π² STL ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² ΡΠΎΠ²Π΅ΡΠ΅ 3).
ΠΠ΅ΡΡΠΏΠΎΡΠ½ΠΎ, ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π°ΠΆΠ½ΡΠΌ ΡΠ°ΠΊΡΠΎΡΠΎΠΌ, ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ ΠΎΡΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π½Π΅ Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΎΡΡ ΠΌΠ°Π»Ρ ΠΈ ΠΌΠΎΠ½ΠΎΠΌΠΎΡΡΠ½Ρ. ΠΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ² ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΉ ΠΏΠ΅ΡΠ΅Π΄ ΠΎΠ±ΡΡΠ½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ Π½Π° ΠΎΠ±ΡΠ΅ΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΎΡ ΠΏΡΠΈΡΠΎΠ΄Ρ Β«ΡΠΏΠΈΡΠ°Π½Π½ΡΒ», ΠΈ ΠΎΡΠ΅Π½Ρ Π²Π°ΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ ΠΌΠΎΠ³Π»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°ΠΌ STL ΡΠ°ΠΊ ΠΆΠ΅ ΠΏΡΠΎΡΡΠΎ, ΠΊΠ°ΠΊ ΠΈ ΠΈΡ Β«ΡΠΎΡΠΈΠ΅Β» ΡΠΎΠ±ΡΠ°ΡΡΡ.
Π‘ΡΠΎΠ»Ρ ΠΆΠ΅ Π½Π΅ΡΠ΅Π°Π»ΠΈΡΡΠΈΡΠ΅Π½ ΠΈ Π·Π°ΠΏΡΠ΅Ρ Π½Π° ΠΏΠΎΠ»ΠΈΠΌΠΎΡΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΎΡΡ. ΠΠ΅ΡΠ°ΡΡ ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ ΠΎΡΠ½ΠΎΡΡΡΡΡ ΠΊ ΡΠΈΡΠ»Ρ Π²Π°ΠΆΠ½Π΅ΠΉΡΠΈΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠ΅ΠΉ C++, ΠΈ ΠΏΡΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠ»Π°ΡΡΠΎΠ² ΡΡΠ½ΠΊΡΠΎΡΠΎΠ² ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΠ½Π΅ΡΡΠΈ ΡΠ°ΠΊΡΡ ΠΆΠ΅ ΠΏΠΎΠ»ΡΠ·Ρ, ΠΊΠ°ΠΊ ΠΈ Π² Π΄ΡΡΠ³ΠΈΡ ΠΎΠ±Π»Π°ΡΡΡΡ . Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΊΠ»Π°ΡΡΡ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ² Π±Π΅Π· Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ? C++ Π±Π΅Π· Β«++Β». ΠΡΠ°ΠΊ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ ΡΡΠ΅Π΄ΡΡΠ²Π°, ΠΊΠΎΡΠΎΡΡΠ΅ Π±Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ»ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π±ΠΎΠ»ΡΡΠΈΠ΅ ΠΈ/ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Ρ ΡΠΎΠ±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ΠΌ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π² STL ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ² ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
Π’Π°ΠΊΠΈΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ. ΠΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π²Π·ΡΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΈ/ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡΡΠ½ΡΠ΅ ΡΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ Π² ΠΊΠ»Π°ΡΡΠ΅ ΡΡΠ½ΠΊΡΠΎΡΠ°, ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ ΠΈΡ Π² Π΄ΡΡΠ³ΠΎΠΉ ΠΊΠ»Π°ΡΡ ΠΈ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ Π² ΠΊΠ»Π°ΡΡΠ΅ ΡΡΠ½ΠΊΡΠΎΡΠ° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠΎΡ Π½ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ° ΠΏΠΎΠ»ΠΈΠΌΠΎΡΡΠ½ΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΎΡΠ° Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ Π΄Π°Π½Π½ΡΡ :
template // BPFC = «Big Polymorphic
class BPFC: // Functor class»
public // ΠΠ°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ ΠΎΠΏΠΈΡΠ°Π½
Widget w; // ΠΠ»Π°ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΌ
int Ρ ; // Π΄Π°Π½Π½ΡΡ , ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ°
// Π±ΡΠ»Π° Π±Ρ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠΉ
virtual void operator()(const T& val) const; // ΠΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ.
ΠΡ Π²ΡΠ΄Π΅Π»ΡΠ΅ΠΌ Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΈ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΠΊΠ»Π°ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΠΉ, ΠΌΠΎΠ½ΠΎΠΌΠΎΡΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΊΠ»Π°ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ:
template //ΠΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ
class BPFCImpl <//Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ³ΠΎ BPFC.
Widget w; // ΠΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΡΠ°Π½Π΅Π΅ Π½Π°Ρ ΠΎΠ΄ΠΈΠ²ΡΠΈΠ΅ΡΡ
int Ρ ; // Π² BPFC, ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΡΡΡΡ
BPFCImpl(); // Π ΠΏΠΎΠ»ΠΈΠΌΠΎΡΡΠ½ΡΡ ΠΊΠ»Π°ΡΡΠ°Ρ Π½ΡΠΆΠ΅Π½
virtual void operator()(const T& val) const;
friend class BPFC ; // Π Π°Π·ΡΠ΅ΡΠΈΡΡ BPFC Π΄ΠΎΡΡΡΠΏ ΠΊ Π΄Π°Π½Π½ΡΠΌ
class BPFC: // ΠΠΎΠΌΠΏΠ°ΠΊΡΠ½Π°Ρ, ΠΌΠΎΠ½ΠΎΠΌΠΎΡΡΠ½Π°Ρ Π²Π΅ΡΡΠΈΡ
BPFCImpl * pImpl; // ΠΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ BPFC
void operator()(const T& val) const; // Π€ΡΠ½ΠΊΡΠΈΡ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ
ΠΠ°ΡΠ΅ΡΠΈΠ°Π» ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΊΡΠ°ΡΠΊΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π±Π°Π·ΠΎΠ²ΡΠ΅ ΠΏΡΠΈΠ΅ΠΌΡ Ρ ΠΎΡΠΎΡΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½Ρ Π² ΠΊΡΡΠ³Π°Ρ C++. Π ΠΊΠ½ΠΈΠ³Π΅ Β«Effective C++Β» ΡΡΠΎΠΉ ΡΠ΅ΠΌΠ΅ ΠΏΠΎΡΠ²ΡΡΠ΅Π½ ΡΠΎΠ²Π΅Ρ 34. Π ΠΊΠ½ΠΈΠ³Π΅ Β«ΠΡΠΈΠ΅ΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡΒ» [6] ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ°Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠ° Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Β«ΠΏΠ°ΡΡΠ΅ΡΠ½ BridgeΒ». Π‘Π°ΡΡΠ΅Ρ Π² ΡΠ²ΠΎΠ΅ΠΉ ΠΊΠ½ΠΈΠ³Π΅ Β«Exceptional C++Β» [8] ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ΅ΡΠΌΠΈΠ½ Β«ΠΈΠ΄ΠΈΠΎΠΌΠ° Pimpl Β».
Π ΡΡΡΠ½ΠΎΡΡΠΈ, ΠΊΠΎΠΏΠΈΡΡΡΡΠΈΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ BPFC β Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅, ΠΎ ΡΠ΅ΠΌ Π²Π°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΏΠΎΠ±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡΡΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ² ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΉ STL Π²ΡΠ΅Π³Π΄Π° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (ΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΎΡΡ Π²ΡΡΠ΅ ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ?). ΠΠ· ΡΡΠΎΠ³ΠΎ Π²ΡΡΠ΅ΠΊΠ°ΡΡ Π΄Π²Π° ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ: ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΎΡΡΡ ΠΈ ΠΌΠΎΠ½ΠΎΠΌΠΎΡΡΠΈΠ·ΠΌ.
Π‘ΠΎΠ²Π΅Ρ 39. Π Π΅Π°Π»ΠΈΠ·ΡΠΉΡΠ΅ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ Π² Π²ΠΈΠ΄Π΅ Β«ΡΠΈΡΡΡΡ Β» ΡΡΠ½ΠΊΡΠΈΠΉ
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΡΡ Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌΠΈ ΡΠ΅ΡΠΌΠΈΠ½Π°ΠΌΠΈ.
β’ Β«Π§ΠΈΡΡΠΎΠΉΒ» ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΎΠΉ Π·Π°Π²ΠΈΡΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ². ΠΡΠ»ΠΈ f β Β«ΡΠΈΡΡΠ°ΡΒ» ΡΡΠ½ΠΊΡΠΈΡ, Π° x ΠΈ y β ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ f(x, y) ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ»ΡΡΠ°Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Ρ ΠΈΠ»ΠΈ Ρ.
Π C++ Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Β«ΡΠΈΡΡΡΠΌΠΈΒ» ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ, Π»ΠΈΠ±ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π² Π²ΠΈΠ΄Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², Π»ΠΈΠ±ΠΎ ΠΎΡΡΠ°ΡΡΡΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΠΌΠΈ Π½Π° ΠΏΡΠΎΡΡΠΆΠ΅Π½ΠΈΠΈ Π²ΡΠ΅Π³ΠΎ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° ΡΡΠ½ΠΊΡΠΈΠΈ (Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, ΡΠ°ΠΊΠΈΠ΅ ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΎΠ±ΡΡΠ²Π»ΡΡΡΡΡ Ρ ΠΊΠ»ΡΡΠ΅Π²ΡΠΌ ΡΠ»ΠΎΠ²ΠΎΠΌ const). ΠΡΠ»ΠΈ Π±Ρ Π΄Π°Π½Π½ΡΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Β«ΡΠΈΡΡΠΎΠΉΒ» ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ, ΠΌΠΎΠ³Π»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΠ·ΠΎΠ²Π°ΠΌΠΈ, ΡΠΎ Π²ΡΠ·ΠΎΠ² ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΡΠ°Π·Π½ΡΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΠΌΠΎΠ³ Π±Ρ Π΄Π°Π²Π°ΡΡ ΡΠ°Π·Π½ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ, ΡΡΠΎ ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ΅ΡΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Β«ΡΠΈΡΡΠΎΠΉΒ» ΡΡΠ½ΠΊΡΠΈΠΈ.
ΠΠ· ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ Π±ΡΠ»ΠΈ Β«ΡΠΈΡΡΡΠΌΠΈΒ» ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ. ΠΠ½Π΅ ΠΎΡΡΠ°Π΅ΡΡΡ Π»ΠΈΡΡ ΡΠ±Π΅Π΄ΠΈΡΡ ΡΠΈΡΠ°ΡΠ΅Π»Ρ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠ° ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ ΠΎΠ±ΠΎΡΠ½ΠΎΠ²Π°Π½Π°. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π²Π²Π΅ΡΡΠΈ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠ΅ΡΠΌΠΈΠ½.
ΠΠ±Π΅ΡΠ°Ρ, ΡΡΠΎ Π½ΠΎΠ²ΡΡ ΡΠ΅ΡΠΌΠΈΠ½ΠΎΠ² Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ. Π’Π΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠ²Π΅ΡΠ°.
Π ΡΠΎΠ²Π΅ΡΠ΅ 38 ΠΎΠ±ΡΡΡΠ½ΡΠ»ΠΎΡΡ, ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ·Π°Π±ΠΎΡΠΈΡΡΡΡ ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΌ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ. ΠΠ»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΉ, ΡΠ²Π»ΡΡΡΠΈΡ ΡΡ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ°ΠΌΠΈ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΈ Π΄ΡΡΠ³ΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π² ΠΏΠΎΠ»ΡΠ·Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ»Π³ΠΎΡΠΈΡΠΌΡ ΠΌΠΎΠ³ΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΊΠΎΠΏΠΈΠΈ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ² ΠΈ Ρ ΡΠ°Π½ΠΈΡΡ ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ, ΠΏΡΠΈΡΠ΅ΠΌ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² ΡΡΠΈΠΌ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ. ΠΠ°ΠΆΠ½Π΅ΠΉΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ΠΌ ΡΡΠΎΠ³ΠΎ ΡΠ°ΠΊΡΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Β«ΡΠΈΡΡΡΠΌΠΈΒ».
class BadPredicate: // ΠΠ°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ ΠΎΠΏΠΈΡΠ°Π½
BadPredicate(): timesCalles(0) <> // ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ timesCalled
bool operator()(const Widget&) <
return ++timesCalled = 3;
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΊΠ»Π°ΡΡ BadPedicate ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΡΠ΅ΡΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Widget ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° vector :
vector vw; // Π‘ΠΎΠ·Π΄Π°ΡΡ Π²Π΅ΠΊΡΠΎΡ ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΡ Π΅Π³ΠΎ
vww.erase(remove_if(vw.begin(), // Π£Π΄Π°Π»ΠΈΡΡ ΡΡΠ΅ΡΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Widget.
vw.end(), // ΡΠ²ΡΠ·Ρ ΠΌΠ΅ΠΆΠ΄Ρ erase ΠΈ remove_if
BadPredcate()), // ΠΎΠΏΠΈΡΠ°Π½Π° Π² ΡΠΎΠ²Π΅ΡΠ΅ 32
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π²ΠΏΠΎΠ»Π½Π΅ ΡΠ°Π·ΡΠΌΠ½ΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡ STL ΠΈΠ· Π²Π΅ΠΊΡΠΎΡΠ° vw ΡΠ΄Π°Π»ΡΠ΅ΡΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ΅ΡΠΈΠΉ, Π½ΠΎ ΠΈ ΡΠ΅ΡΡΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ!
FwdIterator remove_if(FwdIterator begin, FwdIterator end, Predicate p) <
begin = find_if(begin, end, p);
if (begin==end) return begin;
return remove_copy_if(++next, end, begin, p);
Π§ΡΠΎΠ±Ρ ΠΎΠ±ΠΎΠΉΡΠΈ ΡΡΡ Π»ΠΈΠ½Π³Π²ΠΈΡΡΠΈΡΠ΅ΡΠΊΡΡ Π»ΠΎΠ²ΡΡΠΊΡ, ΠΏΡΠΎΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ operator() Ρ ΠΊΠ»ΡΡΠ΅Π²ΡΠΌ ΡΠ»ΠΎΠ²ΠΎΠΌ const Π² ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΠ°:
bool operator()(const Widget&) const <
return ++timesCalled == 3; // ΠΡΠΈΠ±ΠΊΠ°! ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ
> // Π² ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ
Π Π°Π½Π΅Π΅ Π² ΡΡΠΎΠΌ ΡΠΎΠ²Π΅ΡΠ΅ ΡΠΆΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π²ΡΡΠ΄Ρ, Π³Π΄Π΅ STL ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΌΠΎΠΆΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡΡΡ Π»ΠΈΠ±ΠΎ ΡΠ΅Π°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°. ΠΡΠΎΡ ΠΏΡΠΈΠ½ΡΠΈΠΏ Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Π² ΠΎΠ±ΠΎΠΈΡ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΡ . Π Π»ΡΠ±ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅, Π³Π΄Π΅ STL ΡΠ°ΡΡΡΠΈΡΡΠ²Π°Π΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ ΠΈ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ptr_fun β ΡΠΌ. ΡΠΎΠ²Π΅Ρ 41). Π’Π΅ΠΏΠ΅ΡΡ Π²Ρ Π·Π½Π°Π΅ΡΠ΅, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ operator() Π² ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ½ΡΡ ΠΊΠ»Π°ΡΡΠ°Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Β«ΡΠΈΡΡΡΠΌΠΈΒ» ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ΅ΡΡΡ ΠΈ Π½Π° ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ. Π‘Π»Π΅Π΄ΡΡΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠ»ΠΎΡ Π° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ°, ΠΊΠ°ΠΊ ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠ»Π°ΡΡΠ° BadPredcate :
bool anotherBadPredicate(const Widget&, const Widget&) <
static int timesCalled = 0; // ΠΠ΅Ρ! ΠΠ΅Ρ! ΠΠ΅Ρ! ΠΠ΅Ρ! ΠΠ΅Ρ! ΠΠ΅Ρ!
return ++timesCalled == 3; // ΠΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ «ΡΠΈΡΡΡΠΌΠΈ»
> // ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ, Π° «ΡΠΈΡΡΡΠ΅» ΡΡΠ½ΠΊΡΠΈΠΈ
// Π½Π΅ ΠΈΠΌΠ΅ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ
ΠΠ°ΠΊ Π±Ρ Π²Ρ Π½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π»ΠΈ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ, ΠΎΠ½ΠΈ Π²ΡΠ΅Π³Π΄Π° Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Β«ΡΠΈΡΡΡΠΌΠΈΒ» ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ.
Π‘ΠΎΠ²Π΅Ρ 40. ΠΠ»Π°ΡΡΡ ΡΡΠ½ΠΊΡΠΎΡΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π°Π΄Π°ΠΏΡΠΈΡΡΠ΅ΠΌΡΠΌΠΈ
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ Π½Π°Ρ ΠΈΠΌΠ΅Π΅ΡΡΡ ΡΠΏΠΈΡΠΎΠΊ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Widget* ΠΈ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ Widget Β«ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΌΒ»:
bool isInteresting(const Widget *pw);
list ::iterator i = find_if(widgetPts.begin(), widgetPts.end(),
β¦ // ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ «ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠ³ΠΎ»
> // ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Widget
list ::iterator i = find_if(widgetPtrs.begin(), widgetPtrs.end(),
not1(isInteresting)); // ΠΡΠΈΠ±ΠΊΠ°! He ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ
ΠΠ΅ΡΠ΅Π΄ not1 ΠΊ ΡΡΠ½ΠΊΡΠΈΠΈ isInteresting Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ptr_fun :
ΠΠΏΡΠΎΡΠ΅ΠΌ, Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΡΠ°ΠΊ. unary_function ΠΈ binary_function ΡΠ²Π»ΡΡΡΡΡ ΡΠ°Π±Π»ΠΎΠ½Π°ΠΌΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΡΠΌΠΎΠ΅ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ Π½ΠΈΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΡΡΡΠΊΡΡΡΡ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΡΠΈΡ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ², Π° Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Π·Π°ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΡΠΈΠΏΠΎΠ². ΠΠ»Ρ unary_function Π·Π°Π΄Π°Π΅ΡΡΡ ΡΠΈΠΏ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°, ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ operator() Π²Π°ΡΠ΅Π³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΡΡΠ½ΠΊΡΠΎΡΠ°, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΈΠΏ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΠ»Ρ binary_function ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΈΠΏΠΎΠ² ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ Π΄ΠΎ ΡΡΠ΅Ρ : ΡΠΈΠΏΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΈ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² operator() ΠΈ ΡΠΈΠΏ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
class MeetsThreshold: public std::unary_function <
Meets Threshold(const T& threshold);
bool operator()(const WidgetS) const;
ΠΠ΅ΡΠ½Π΅ΠΌΡΡ ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ WidgetNameCompare:
bool operator()(const Widget* lhs, const Widget* rhs) const;
ΠΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ Π±Π°Π·ΠΎΠ²ΡΠ΅ ΠΊΠ»Π°ΡΡΡ unary_function ΠΈ binary_function Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Ρ Π²Π°ΠΆΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ β ΠΎΠ½ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ², Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Π°Π΄Π°ΠΏΡΠ΅ΡΠΎΠ², ΠΏΠΎΡΡΠΎΠΌΡ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ ΡΡΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅Ρ Π°Π΄Π°ΠΏΡΠΈΡΡΠ΅ΠΌΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ:
list ::reverse_iterator i1 = // ΠΠ°ΠΉΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ
find_if(widgets.rbegin(), widgets.rend(), // Widget, Π½Π΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ
not1(MeetsThreshold (10))); // ΠΏΠΎΡΠΎΠ³ΠΎΠ²ΠΎΠΌΡ ΠΊΡΠΈΡΠ΅ΡΠΈΡ 10
//(ΡΡΠΎ Π±Ρ ΡΡΠΎ Π½ΠΈ ΠΎΠ·Π½Π°ΡΠ°Π»ΠΎ)
Widget w(Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°); // ΠΠ°ΠΉΡΠΈ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Widget.
list ::iterator i2 = // ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ w Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅
find_if(widgets.begin(), widgets.end(), // ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ
bind2nd(WidgetNameCompare(), w)); // WidgetNameCompare
ΠΠ½ΠΎΠ³Π΄Π° Π² ΠΊΠ»Π°ΡΡΠ΅ ΡΡΠ½ΠΊΡΠΎΡΠ° Π±ΡΠ²Π°Π΅Ρ ΡΠ°Π·ΡΠΌΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΎΡΠΌ Π²ΡΠ·ΠΎΠ²Π°, ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΎΡΠΊΠ°Π·Π°Π²ΡΠΈΡΡ ΠΎΡ Π°Π΄Π°ΠΏΡΠΈΡΡΠ΅ΠΌΠΎΡΡΠΈ (ΠΏΡΠΈΠΌΠ΅ΡΡ ΡΠ°ΠΊΠΈΡ ΡΠΈΡΡΠ°ΡΠΈΠΉ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ Π² ΡΠΎΠ²Π΅ΡΠ°Ρ 7, 20, 23 ΠΈ 25), Π½ΠΎ ΡΡΠΎ ΡΠΊΠΎΡΠ΅Π΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, Π° Π½Π΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ. ΠΠ΄Π°ΠΏΡΠΈΡΡΠ΅ΠΌΠΎΡΡΡ Π²Π°ΠΆΠ½Π°, ΠΈ ΠΎ Π½Π΅ΠΉ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠΎΠΌΠ½ΠΈΡΡ ΠΏΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΊΠ»Π°ΡΡΠΎΠ² ΡΡΠ½ΠΊΡΠΎΡΠΎΠ².
Π‘ΠΎΠ²Π΅Ρ 41. Π Π°Π·Π±Π΅ΡΠΈΡΠ΅ΡΡ, Π΄Π»Ρ ΡΠ΅Π³ΠΎ Π½ΡΠΆΠ½Ρ ptr_fun, mem_fun ΠΈ mem_fun_ref
ΠΠ°Π³Π°Π΄ΠΎΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ptr_fun/mem_fun/mem_fun_ref ΡΠ°ΡΡΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ Π½Π΅Π΄ΠΎΡΠΌΠ΅Π½ΠΈΠ΅. Π ΠΎΠ΄Π½ΠΈΡ ΡΠ»ΡΡΠ°ΡΡ ΠΈΡ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΈΠ΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π² Π΄ΡΡΠ³ΠΈΡ ΠΎΠ½ΠΈ Π½Π΅ Π½ΡΠΆΠ½Ρβ¦ Π½ΠΎ ΡΡΠΎ ΠΆΠ΅ ΠΎΠ½ΠΈ Π²ΡΠ΅-ΡΠ°ΠΊΠΈ Π΄Π΅Π»Π°ΡΡ? ΠΠ° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄ ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ Π±Π΅ΡΡΠΌΡΡΠ»Π΅Π½Π½ΠΎ Π·Π°Π³ΡΠΎΠΌΠΎΠΆΠ΄Π°ΡΡ ΠΈΠΌΠ΅Π½Π° ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΡ Π½Π΅ΡΠ΄ΠΎΠ±Π½ΠΎ Π²Π²ΠΎΠ΄ΠΈΡΡ ΠΈ ΡΠΈΡΠ°ΡΡ, ΠΎΠ½ΠΈ Π·Π°ΡΡΡΠ΄Π½ΡΡΡ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π§ΡΠΎ ΡΡΠΎ β ΠΎΡΠ΅ΡΠ΅Π΄Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΆΠΈΡΠΊΠΈ ΠΏΡΠΎΡΠ»ΠΎΠ³ΠΎ STL (Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΈΡΡ Π² ΡΠΎΠ²Π΅ΡΠ°Ρ 10 ΠΈ 18) ΠΈΠ»ΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΡΡΠΊΠ°, ΠΏΡΠΈΠ΄ΡΠΌΠ°Π½Π½Π°Ρ ΡΠ»Π΅Π½Π°ΠΌΠΈ ΠΠΎΠΌΠΈΡΠ΅ΡΠ° ΠΏΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·Π°ΡΠΈΠΈ Ρ ΠΈΠ·Π²ΡΠ°ΡΠ΅Π½Π½ΡΠΌ ΡΡΠ²ΡΡΠ²ΠΎΠΌ ΡΠΌΠΎΡΠ°?
Π C++ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΡΠΈ Π²Π°ΡΠΈΠ°Π½ΡΠ° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ f Π΄Π»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° x :
f(x); // Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ 1: f Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΊΠ»Π°ΡΡΠ°
//(Π²ΡΠ·ΠΎΠ² Π²Π½Π΅ΡΠ½Π΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ)
x.f(); // Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ 2: f ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΊΠ»Π°ΡΡΠ°, Π° Ρ
// ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ ΠΈΠ»ΠΈ ΡΡΡΠ»ΠΊΠΎΠΉ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ
p->f(); // Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ 3: f ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΊΠ»Π°ΡΡΠ°,
// Π° Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Ρ
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π³ΠΈΠΏΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΡ Π΄Π»Ρ Β«ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈΒ» ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Widget :
void test(Widget& w); // ΠΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ w. ΠΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ Π½Π΅ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ
// ΠΏΡΠΎΠ²Π΅ΡΠΊΡ, ΠΎΠ½ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΠΊΠ°ΠΊ «ΠΏΠ»ΠΎΡ ΠΎΠΉ»
ΠΠΎΠΏΡΡΡΠΈΠΌ, Ρ Π½Π°Ρ ΠΈΠΌΠ΅Π΅ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Widget :
vector vw; // vw ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ Widget
ΠΠ»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Widget Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ vw ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠΌ for_each :
for_each(vw.begin(), vw.end(), test); // ΠΠ°ΡΠΈΠ°Π½Ρ 1 (Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ)
void test(); // ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠ°ΠΌΠΎΠΏΡΠΎΠ²Π΅ΡΠΊΡ. ΠΡΠ»ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°
β¦ // Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ΅ΠΉ, ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΡΡ
Π ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎΠΌ ΠΌΠΈΡΠ΅ ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ for_each Π΄Π»Ρ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ Widget::test Π²ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π²Π΅ΠΊΡΠΎΡΠ° vw :
ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ Π½Π°Ρ ΠΌΠΈΡ Π±ΡΠ» Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΠΌ, Π°Π»Π³ΠΎΡΠΈΡΠΌ for_each ΠΌΠΎΠ³ Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΈ Π΄Π»Ρ Π²ΡΠ·ΠΎΠ²Π° Widget::test Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Widget* :
list lpw; // Π‘ΠΏΠΈΡΠΎΠΊ lpw ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ
for_each(lpw.begin(), lpw.end(), // ΠΠ°ΡΠΈΠ°Π½Ρ 3 (Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ!)
ΠΠΎ ΠΏΠΎΠ΄ΡΠΌΠ°ΠΉΡΠ΅, ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ Π² ΡΡΠΎΠΌ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎΠΌ ΠΌΠΈΡΠ΅. ΠΠ½ΡΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ for_each Π² Π²Π°ΡΠΈΠ°Π½ΡΠ΅ 1 Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π²Π½Π΅ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ 1. ΠΠ½ΡΡΡΠΈ Π²ΡΠ·ΠΎΠ²Π° for_each Π² Π²Π°ΡΠΈΠ°Π½ΡΠ΅ 2 ΡΠ»Π΅Π΄ΠΎΠ²Π°Π»ΠΎ Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ 2, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΊΠ»Π°ΡΡΠ°. Π Π²Π½ΡΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ for_each Π² Π²Π°ΡΠΈΠ°Π½ΡΠ΅ 3 ΠΏΡΠΈΡΠ»ΠΎΡΡ Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ 3, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΅ΡΡ ΠΈΠ΄Π΅Ρ ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ° ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΠ»ΠΈΡΡ Π±Ρ ΡΡΠΈΡΠ°Π·Π½ΡΡ Π²Π΅ΡΡΠΈΠΈ for_each β ΡΠ°Π·Π²Π΅ ΡΠ°ΠΊΠΎΠΉ ΠΌΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°ΡΡ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΠΌ?
Function for_each(InputIterator begin, InputIterator end, Function f) <
ΠΠΈΡΠ½ΡΠΉ ΡΡΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ for_each ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ 1. Π STL ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π²ΡΠ΅ΠΎΠ±ΡΠ΅Π΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π²ΡΠ΅Π³Π΄Π° Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π² ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΎΡΠΌΠ΅ (ΠΊΠ°ΠΊ Π²Π½Π΅ΡΠ½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ). Π‘ΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΠΏΠΎΡΠ΅ΠΌΡ Π²Π°ΡΠΈΠ°Π½Ρ 1 ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ, Π° Π²Π°ΡΠΈΠ°Π½ΡΡ 2 ΠΈ 3 Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΡΡΡΡ β Π°Π»Π³ΠΎΡΠΈΡΠΌΡ STL (Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ for_each ) ΠΆΠ΅ΡΡΠΊΠΎ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Ρ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° Π²Π½Π΅ΡΠ½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ, Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ Π²Π°ΡΠΈΠ°Π½Ρ 1.
ΠΡΠΈΠ½ΡΠΈΠΏ ΡΠ°Π±ΠΎΡΡ mem_fun ΠΈ mem_fun_ref ΠΏΡΠΎΡΡ, Ρ ΠΎΡΡ Π΄Π»Ρ ΠΏΡΡΠ΅ΠΉ ΡΡΠ½ΠΎΡΡΠΈ ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ. Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΎΠ½ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΠΉ ΡΠ°Π±Π»ΠΎΠ½Ρ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΏΡΠΈΡΠ΅ΠΌ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² mem_fun ΠΈ mem_fun_ref Π΄Π»Ρ ΡΠ°Π·Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΈ Π½Π°Π»ΠΈΡΠΈΡ-ΠΎΡΡΡΡΡΡΠ²ΠΈΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΡΡΠΈ Π°Π΄Π°ΠΏΡΠΈΡΡΠ΅ΠΌΡΡ ΠΈΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΊΠ»Π°ΡΡΠΎΠ². ΠΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ Π²ΠΏΠΎΠ»Π½Π΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Π² ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡΠ΅ΠΌ:
template // ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ mem_fun Π΄Π»Ρ Π½Π΅ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΡ
// Π½Π° ΠΊΠΎΡΠΎΡΡΡ ΡΡΡΠ»Π°Π΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ
list lpw; // Π‘ΠΌ. ΡΠ°Π½Π΅Π΅
mem_fun(&Widget::test)); // Π’Π΅ΠΏΠ΅ΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ
for_each(vw.begin(), vw.end(), test); // Π‘ΠΌ. ΡΠ°Π½Π΅Π΅, Π²Π°ΡΠΈΠ°Π½Ρ 1.
ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ, Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΡΡΡΡ:
for_each(vw.begin(), vw.end(), &Widget::test); // Π‘ΠΌ. ΡΠ°Π½Π΅Π΅, Π²Π°ΡΠΈΠ°Π½Ρ 2.
for_each(lpw.begin(), lpw.end(), &Widget::test); // Π‘ΠΌ. ΡΠ°Π½Π΅Π΅, Π²Π°ΡΠΈΠ°Π½Ρ 3.
for_each(vw.begin(), vw.end(), ptr_fun(test)); // ΠΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ ΠΈ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ,
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΈ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ β ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ptr_fun Π² ΡΠ»ΡΡΠ°Π΅ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ. ΠΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΡΠ°ΠΌ, Π³Π΄Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ², ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π²ΡΠ΄Π°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅. Π’ΠΎΠ³Π΄Π° Π²Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΠ΅ΡΡ ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΈ Π²ΠΊΠ»ΡΡΠ°Π΅ΡΠ΅ Π² Π½Π΅Π΅ ΠΏΡΠΎΠΏΡΡΠ΅Π½Π½ΡΠΉ Π²ΡΠ·ΠΎΠ².
Π‘ mem_fun ΠΈ mem_fun_ref ΡΠΈΡΡΠ°ΡΠΈΡ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈΠ°Π»ΡΠ½ΠΎ ΠΈΠ½Π°Ρ. ΠΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠ΅Π³Π΄Π° Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌ STL, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ² (Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΈΠ»ΠΈ Π½Π΅Ρ) ΠΎΠ½ΠΈ Π°Π΄Π°ΠΏΡΠΈΡΡΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π²ΡΠ·ΠΎΠ²Π°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΊΠ»Π°ΡΡΠ°, ΠΊ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΡ, ΠΏΡΠΈΠ½ΡΡΠΎΠΌΡ Π² STL. ΠΡΠ»ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ°, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡΡΡ.
Π‘ΠΎΠ²Π΅Ρ 42. Π‘Π»Π΅Π΄ΠΈΡΠ΅ Π·Π° ΡΠ΅ΠΌ, ΡΡΠΎΠ±Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ less ΠΎΠ·Π½Π°ΡΠ°Π»Π° operator Widget ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌΠΈ weight ΠΈ maxSpeed :
size_t weight() const;
size_t maxSpeed() const;
template<> // Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ std::less
struct std::less : // Π΄Π»Ρ Widget: ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄
public // ΡΡΠΈΡΠ°Π΅ΡΡΡ ΠΊΡΠ°ΠΉΠ½Π΅ Π½Π΅ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΡΠΌ!
Widget, // ΠΠ°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ ΠΎΠΏΠΈΡΠ°Π½
bool operator() (const Widget& lhs, const Widget& rhs) const <
template // Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ std::less
struct less >: // Π΄Π»Ρ boost::shared_ptr
bool operator()(const boost::shared_ptr & a,
const boost::shared_ptr & b) const <
return less ()(a.get(), b.get()); // shared_ptr::get Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ
>; // ΠΈΠ· ΠΎΠ±ΡΠ΅ΠΊΡΠ° shared_ptr
Π Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π²ΠΏΠΎΠ»Π½Π΅ ΡΠ°Π·ΡΠΌΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ less Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΡΠΌΠ½ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ Ρ ΠΏΠΎΡΡΠ΄ΠΊΠΎΠΌ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΠΈΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΎΠ². Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π½Π°ΡΠ° ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ less Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ° Widget ΠΏΡΠ΅ΠΏΠΎΠ΄Π½ΠΎΡΠΈΡ Π½Π΅ΠΏΡΠΈΡΡΠ½ΡΠΉ ΡΡΡΠΏΡΠΈΠ·.
bool operator()(const Widget& lhs, const Widget& rhs) const <