Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ 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. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π€ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹ (Π³Π»Π°Π²Π° ΠΊΠ½ΠΈΠ³ΠΈ «ВСория ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ для программистов»)

Π­Ρ‚ΠΎ сСдьмая ΡΡ‚Π°Ρ‚ΡŒΡ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° «ВСория ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ для программистов». ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΡƒΠΆΠ΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈΡΡŒ Π½Π° Π₯Π°Π±Ρ€Π΅:

Π€ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹

Π—Π° понятиСм Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π° стоит ΠΎΡ‡Π΅Π½ΡŒ простая, Π½ΠΎ мощная идСя (ΠΊΠ°ΠΊ Π±Ρ‹ Π·Π°Π΅Π·ΠΆΠ΅Π½ΠΎ это Π½ΠΈ ΠΏΡ€ΠΎΠ·Π²ΡƒΡ‡Π°Π»ΠΎ). ΠŸΡ€ΠΎΡΡ‚ΠΎ тСория ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ ΠΏΠΎΠ»Π½Π° простых ΠΈ ΠΌΠΎΡ‰Π½Ρ‹Ρ… ΠΈΠ΄Π΅ΠΉ. Π€ΡƒΠ½ΠΊΡ‚ΠΎΡ€ Π΅ΡΡ‚ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ катСгориями. ΠŸΡƒΡΡ‚ΡŒ Π΄Π°Π½Ρ‹ Π΄Π²Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ C ΠΈ D, Π° Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ F ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· C Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· D β€” это функция Π½Π°Π΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. Если a β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ· C, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π· ΠΈΠ· D ΠΊΠ°ΠΊ F a (Π±Π΅Π· скобок). Но вСдь катСгория β€” это Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½ΠΎ Π΅Ρ‰Π΅ ΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‰ΠΈΠ΅ ΠΈΡ… ΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΡ‹. Π€ΡƒΠ½ΠΊΡ‚ΠΎΡ€ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΈ ΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΡ‹ β€” это функция Π½Π°Π΄ ΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°ΠΌΠΈ. Но ΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΡ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π½Π΅ ΠΊΠ°ΠΊ ΠΏΠΎΠΏΠ°Π»ΠΎ, Π° Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ связи. А ΠΈΠΌΠ΅Π½Π½ΠΎ, Ссли ΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ f ΠΈΠ· C связываСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ a с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ b,

Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π· f Π² D, F f, связываСт ΠΎΠ±Ρ€Π°Π· a с ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ b:

(НадССмся, Ρ‡Ρ‚ΠΎ такая смСсь матСматичСских ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ синтаксиса Haskell понятна Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŽ. ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ скобки, примСняя Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΠΈΠ»ΠΈ ΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°ΠΌ.)

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ сохраняСт структуру: Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ связано Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ, Π±ΡƒΠ΄Π΅Ρ‚ связано ΠΈ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ. Но этим структура Π½Π΅ исчСрпываСтся: Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠΎΠ². Если h β€” композиция f ΠΈ g :

Ρ‚ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π· ΠΏΠΎΠ΄ дСйствиСм F Π±Ρ‹Π» ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠ΅ΠΉ ΠΎΠ±Ρ€Π°Π·ΠΎΠ² f ΠΈ g:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c

НаконСц, ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹Π΅(тоТдСствСнныС) ΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΡ‹ ΠΈΠ· C ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π»ΠΈΡΡŒ Π² Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΡ‹ ΠΈΠ· D:

Π—Π΄Π΅ΡΡŒ ida β€” это Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° a, Π° idF a β€” Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° F a.

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ всС эти условия сущСствСнно ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΊΡ€ΡƒΠ³ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, подходящих Π² качСствС ΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠΎΠ². Π€ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ структуру ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ. Если ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ сСбС ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ ΠΊΠ°ΠΊ Π½Π°Π±ΠΎΡ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΠ΅Ρ€Π΅ΠΏΠ»Π΅Ρ‚Π΅Π½Π½Ρ‹Ρ… ΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°ΠΌΠΈ, Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π°Π²Π° ΠΎΠ±ΠΎΡ€Π²Π°Ρ‚ΡŒ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Π½ΠΈΡ‚ΠΈ этого ΠΊΡ€ΡƒΠΆΠ΅Π²Π°. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ нСсколько ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΠ»Π΅ΠΈΡ‚ΡŒ ΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΡ‹ Π² ΠΎΠ΄ΠΈΠ½, Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Ρ€Π°Π·Ρ€Ρ‹Π²Π°Π΅Ρ‚ связСй. Π­Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΠΈΡŽ нСпрСрывности ΠΈΠ· матСматичСского Π°Π½Π°Π»ΠΈΠ·Π°. Π’ этом смыслС Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹ «Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½Ρ‹» (хотя сущСствуСт Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ нСпрСрывности Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ²). Как ΠΈ любая функция, Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ ΡΠΊΠ»Π΅ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ, ΠΈ Π²ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌΠΈ. АспСкт влоТСния Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ярко проявляСтся, ΠΊΠΎΠ³Π΄Π° исходная катСгория Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ мСньшС Ρ†Π΅Π»Π΅Π²ΠΎΠΉ. Π’ ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ случаС исходная катСгория прСдставляСт собой ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ 1, ΡΠΎΡΡ‚ΠΎΡΡ‰ΡƒΡŽ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ (Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠ³ΠΎ) ΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°. Π€ΡƒΠ½ΠΊΡ‚ΠΎΡ€ ΠΈΠ· ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ 1 Π² Π»ΡŽΠ±ΡƒΡŽ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ просто Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ· этой ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ. Π˜ΠΌΠ΅Π΅Ρ‚ мСсто полная аналогия с ΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°ΠΌΠΈ ΠΈΠ· синглтона, Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‰ΠΈΠΌΠΈ элСмСнты ΠΈΠ· Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… мноТСств. АспСкт склСивания, Π΄ΠΎΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π΄ΠΎ абсурда, Π½Π°Π±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ Π² константном Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π΅ Ξ”c. Он ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ исходной ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ c Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ, Π° всякий ΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ β€” Π² Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ idc. Π­Ρ‚ΠΎ ΠΊΠ°ΠΊ чСрная Π΄Ρ‹Ρ€Π°, Π·Π°ΡΠ°ΡΡ‹Π²Π°ΡŽΡ‰Π°Ρ всС Π² Ρ‚ΠΎΡ‡ΠΊΡƒ сингулярности. ΠœΡ‹ вСрнСмся ΠΊ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ этого Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π° ΠΏΡ€ΠΈ обсуТдСнии ΠΏΡ€Π΅Π΄Π΅Π»ΠΎΠ² ΠΈ ΠΊΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΎΠ².

Π€ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ

ВСрнёмся Π½Π° зСмлю, Π² ΠΌΠΈΡ€ программирования. Π˜Ρ‚Π°ΠΊ, Ρƒ нас Π΅ΡΡ‚ΡŒ катСгория Ρ‚ΠΈΠΏΠΎΠ² ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Рассмотрим Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠ΅ эту ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ Π² сСбя β€” Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ эндофункторы. Π§Ρ‚ΠΎ прСдставляСт собой эндофунктор Π² ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ²? Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΎΠ½ сопоставляСт ΠΎΠ΄Π½ΠΈΠΌ Ρ‚ΠΈΠΏΠ°ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ отобраТСния Π½Π° самом Π΄Π΅Π»Π΅ Π½Π°ΠΌ Π·Π½Π°ΠΊΠΎΠΌΡ‹, это Ρ‚ΠΈΠΏΡ‹, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ. Рассмотрим нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ².

Π€ΡƒΠ½ΠΊΡ‚ΠΎΡ€ Maybe

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Maybe Π΅ΡΡ‚ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° a Π² Ρ‚ΠΈΠΏ Maybe a:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ c

БлСдуя сказанному Π²Ρ‹ΡˆΠ΅, Π΄Π°Π΄ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ 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 <

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *