рдЧреЗрд▓реНрдпрд╛ рдЙрдиреНрд╣рд╛рд│реНрдпрд╛рдд рдореА рднрд╛рдЧ рдШреЗрддрд▓рд╛
Google рд╕рдорд░ рдСрдл рдХреЛрдб 2019 рдордзреНрдпреЗ рд╕рд╣рднрд╛рдЧреА рдореНрд╣рдгреВрди, рдореА рд▓рд╛рдпрдмреНрд░рд░реАрдордзреНрдпреЗ рдПрдХ рдкреНрд░рдХрд▓реНрдк рдХреЗрд▓рд╛
рдпрд╛ рдкреЛрд╕реНрдЯрдордзреНрдпреЗ рдореА рд╣реЕрд╕реНрдХреЗрд▓рдордзреАрд▓ рджреНрд╡рд┐рдкрдХреНрд╖реАрдпрддреЗрд╕рд╛рдареА рдЖрд▓реЗрдЦ рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рдЕрд▓реНрдЧреЛрд░рд┐рджрдордЪреНрдпрд╛ рдорд╛рдЭреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдмрджреНрджрд▓ рдмреЛрд▓реЗрди. рдЬрд░реА рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реЗ рд╕рд░реНрд╡рд╛рдд рдореВрд▓рднреВрдд рдЕрд╕рд▓реЗ рддрд░реА, рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реАрдордзреНрдпреЗ рддреЗ рд╕реБрдВрджрд░рдкрдгреЗ рдЕрдВрдорд▓рд╛рдд рдЖрдгрдгреНрдпрд╛рд╕рд╛рдареА рдорд▓рд╛ рдЕрдиреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддреА рдЭрд╛рд▓реА рдЖрдгрд┐ рдЦреВрдк рдХрд╛рдо рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрд▓реЗ. рдкрд░рд┐рдгрд╛рдореА, рдореА рдореЛрдирд╛рдб рдЯреНрд░рд╛рдиреНрд╕рдлреЙрд░реНрдорд░рд╕рд╣ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрд╡рд░ рд╕реНрдерд╛рдпрд┐рдХ рдЭрд╛рд▓реЛ.
рдорд╛рдЭреНрдпрд╛рдмрджреНрджрд▓
рдорд╛рдЭреЗ рдирд╛рд╡ рд╡рд╕рд┐рд▓реА рдЕрд▓реНрдлреЗрд░реЛрд╡реНрд╣ рдЖрд╣реЗ, рдореА рд╕реЗрдВрдЯ рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ рдПрдЪрдПрд╕рдИ рдпреЗрдереЗ рдЪреМрдереНрдпрд╛ рд╡рд░реНрд╖рд╛рдЪрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдереА рдЖрд╣реЗ. рдпрд╛рдкреВрд░реНрд╡реА рдореА рдмреНрд▓реЙрдЧрдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗ рд╣реЛрддреЗ
рдЕрд▓реНрдЧреЛрд░рд┐рджрдордЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдмрджреНрджрд▓
рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛
рдХрд╛рд░реНрдпрдХреНрд░рдорд╛рдд рд╕рд╣рднрд╛рдЧреА рд╣реЛрдгрд╛рд▒реНрдпрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдВрдирд╛ рдмреНрд▓реЙрдЧрд╕рд╛рдареА рдЬреЛрд░рджрд╛рд░ рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рджрд┐рд▓реЗ рдЬрд╛рддреЗ. рддреНрдпрд╛рдВрдиреА рдорд▓рд╛ рдмреНрд▓реЙрдЧрд╕рд╛рдареА рд╡реНрдпрд╛рд╕рдкреАрда рдЙрдкрд▓рдмреНрдз рдХрд░реВрди рджрд┐рд▓реЗ
рдкреНрд░рд╢реНрдирд╛рддреАрд▓ рдХреЛрдб рдЕрд╕рд▓реЗрд▓реА рдкреБрд▓ рд╡рд┐рдирдВрддреА рдЖрдврд│реВ рд╢рдХрддреЗ
рддреБрдореНрд╣реА рдорд╛рдЭреНрдпрд╛ рдХрд╛рдорд╛рдЪреНрдпрд╛ рдкрд░рд┐рдгрд╛рдорд╛рдВрдмрджреНрджрд▓ рд╡рд╛рдЪреВ рд╢рдХрддрд╛ (рдЗрдВрдЧреНрд░рдЬреАрдордзреНрдпреЗ)
рдпрд╛ рдкреЛрд╕реНрдЯрдЪрд╛ рдЙрджреНрджреЗрд╢ рд╡рд╛рдЪрдХрд╛рдВрдирд╛ рдлрдВрдХреНрд╢рдирд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧрдордзреАрд▓ рдореВрд▓рднреВрдд рд╕рдВрдХрд▓реНрдкрдирд╛рдВрд╕рд╣ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╣реЗ, рдЬрд░реА рд╡реЗрд│ рдпреЗрдИрд▓ рддреЗрд╡реНрд╣рд╛ рдореА рд╡рд╛рдкрд░рд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рд╕рдВрдЬреНрдЮрд╛ рдЖрдард╡рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реЗрди.
рджреНрд╡рд┐рдкрдХреНрд╖реАрдпрддреЗрд╕рд╛рдареА рдЖрд▓реЗрдЦ рддрдкрд╛рд╕рдд рдЖрд╣реЗ
рджреНрд╡рд┐рдкрдХреНрд╖реАрдпрддреЗрд╕рд╛рдареА рдЖрд▓реЗрдЦ рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдЕрд▓реНрдЧреЛрд░рд┐рджрдордЪреНрдпрд╛ рдХреЛрд░реНрд╕рдордзреНрдпреЗ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкрд╛ рдЖрд▓реЗрдЦ рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рдореНрд╣рдгреВрди рджрд┐рд▓рд╛ рдЬрд╛рддреЛ. рддреНрдпрд╛рдЪреА рдХрд▓реНрдкрдирд╛ рд╕рд░рд│ рдЖрд╣реЗ: рдкреНрд░рдердо рдЖрдкрдг рдбрд╛рд╡реНрдпрд╛ рдХрд┐рдВрд╡рд╛ рдЙрдЬрд╡реНрдпрд╛ рднрд╛рдЧрд╛рдордзреНрдпреЗ рд╢рд┐рд░реЛрдмрд┐рдВрджреВ рдареЗрд╡рддреЛ рдЖрдгрд┐ рдЬреЗрд╡реНрд╣рд╛ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рдХрд┐рдирд╛рд░ рдЖрдврд│рддреЗ, рддреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣реА рдард╛рдордкрдгреЗ рд╕рд╛рдВрдЧрддреЛ рдХреА рдЖрд▓реЗрдЦ рджреНрд╡рд┐рдкрдХреНрд╖реАрдп рдирд╛рд╣реА.
рдереЛрдбреЗ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓: рдкреНрд░рдердо рдЖрдкрдг рдбрд╛рд╡реНрдпрд╛ рд╢реЗрдЕрд░рдордзреНрдпреЗ рдХрд╛рд╣реА рд╢рд┐рд░реЛрдмрд┐рдВрджреВ рдареЗрд╡рддреЛ. рдЕрд░реНрдерд╛рдд, рдпрд╛ рд╢рд┐рд░реЛрдмрд┐рдВрджреВрдЪреЗ рд╕рд░реНрд╡ рд╢реЗрдЬрд╛рд░реА рдЙрдЬрд╡реНрдпрд╛ рд▓реЛрдмрдордзреНрдпреЗ рдЕрд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗрдд. рдкреБрдвреЗ, рдпрд╛ рд╢рд┐рд░реЛрдмрд┐рдВрджреВрдЪреНрдпрд╛ рд╢реЗрдЬрд╛рд▒реНрдпрд╛рдВрдЪреЗ рд╕рд░реНрд╡ рд╢реЗрдЬрд╛рд░реА рдбрд╛рд╡реНрдпрд╛ рд▓реЛрдмрдордзреНрдпреЗ рдкрдбрд▓реЗрд▓реЗ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдЖрдгрд┐ рдЕрд╕реЗрдЪ. рдЖрдореНрд╣реА рд╢рд┐рд░реЛрдмрд┐рдВрджреВрдВрдирд╛ рд╕рдорднрд╛рдЧ рдирд┐рдпреБрдХреНрдд рдХрд░рдгреЗ рд╕реБрд░реВ рдареЗрд╡рддреЛ рдЬреЛрдкрд░реНрдпрдВрдд рдЖрдореНрд╣реА рд╕реБрд░реВ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╢рд┐рд░реЛрдмрд┐рдВрджреВрдЪреНрдпрд╛ рдХрдиреЗрдХреНрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдШрдЯрдХрд╛рдордзреНрдпреЗ рдЕрджреНрдпрд╛рдк рд╢рд┐рд░реЛрдмрд┐рдВрджреВ рдЖрд╣реЗрдд рдЬреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рд╢реЗрдЬрд╛рд▒реНрдпрд╛рдВрдирд╛ рдирд┐рдпреБрдХреНрдд рдХреЗрд▓реЗрд▓реЗ рдирд╛рд╣реА. рддреНрдпрд╛рдирдВрддрд░ рдЖрдореНрд╣реА рд╕рд░реНрд╡ рдХрдиреЗрдХреНрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдШрдЯрдХрд╛рдВрд╕рд╛рдареА рд╣реА рдХреНрд░рд┐рдпрд╛ рдкреБрдиреНрд╣рд╛ рдХрд░рддреЛ.
рдЬрд░ рд╕рдорд╛рди рд╡рд┐рднрд╛рдЬрдирд╛рдордзреНрдпреЗ рд╢рд┐рд░реЛрдмрд┐рдВрджреВрдВрдордзреНрдпреЗ рдПрдХ рдзрд╛рд░ рдЕрд╕реЗрд▓ рддрд░, рдЖрд▓реЗрдЦрд╛рдордзреНрдпреЗ рд╡рд┐рд╖рдо рдЪрдХреНрд░ рд╢реЛрдзрдгреЗ рдХрдареАрдг рдирд╛рд╣реА, рдЬреЗ рджреНрд╡рд┐рдкрдХреНрд╖реАрдп рдЖрд▓реЗрдЦрд╛рдордзреНрдпреЗ рд╡реНрдпрд╛рдкрдХрдкрдгреЗ рдЬреНрдЮрд╛рдд (рдЖрдгрд┐ рдЕрдЧрджреА рд╕реНрдкрд╖реНрдЯрдкрдгреЗ) рдЕрд╢рдХреНрдп рдЖрд╣реЗ. рдЕрдиреНрдпрдерд╛, рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдпреЛрдЧреНрдп рд╡рд┐рднрд╛рдЬрди рдЖрд╣реЗ, рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЖрд▓реЗрдЦ рджреНрд╡рд┐рдкрдХреНрд╖реАрдп рдЖрд╣реЗ.
рд╕рд╛рдорд╛рдиреНрдпрддрдГ, рд╣реЗ рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рд╡рд╛рдкрд░реВрди рд▓рд╛рдЧреВ рдХреЗрд▓реЗ рдЬрд╛рддреЗ
рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рдЖрдореНрд╣реА рдЦрд╛рд▓реАрд▓ рдпреЛрдЬрдиреЗрд╡рд░ рдЖрд▓реЛ. рдЖрдореНрд╣реА рдЧрд╣рд░рд╛рдИ-рдкреНрд░рдердо рд╢реЛрдз рд╡рд╛рдкрд░реВрди рдЖрд▓реЗрдЦрд╛рдЪреЗ рд╢рд┐рд░реЛрдмрд┐рдВрджреВ рдкрд╛рд░ рдХрд░рддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рд╢реЗрдЕрд░реНрд╕ рдирд┐рдпреБрдХреНрдд рдХрд░рддреЛ, рдЬрд╕рдЬрд╕реЗ рдЖрдореНрд╣реА рдХрд╛рдард╛рд╡рд░ рдЬрд╛рддреЛ рддрд╕рддрд╕реЗ рд╢реЗрдЕрд░рдЪреА рд╕рдВрдЦреНрдпрд╛ рдмрджрд▓рддреЗ. рдЬрд░ рдЖрдореНрд╣реА рдПрдЦрд╛рджреНрдпрд╛ рд╢рд┐рд░реЛрдмрд┐рдВрджреВрд▓рд╛ рд╢реЗрдЕрд░ рдирд┐рдпреБрдХреНрдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓рд╛ рдЬреНрдпрд╛рдордзреНрдпреЗ рдЖрдзреАрдкрд╛рд╕реВрди рдПрдХ рд╢реЗрдЕрд░ рдирд┐рдпреБрдХреНрдд рдХреЗрд▓рд╛ рдЖрд╣реЗ, рддрд░ рдЖрдореНрд╣реА рд╕реБрд░рдХреНрд╖рд┐рддрдкрдгреЗ рдореНрд╣рдгреВ рд╢рдХрддреЛ рдХреА рдЖрд▓реЗрдЦ рджреНрд╡рд┐рдкрдХреНрд╖реАрдп рдирд╛рд╣реА. рдЬреНрдпрд╛ рдХреНрд╖рдгреА рд╕рд░реНрд╡ рд╢рд┐рд░реЛрдмрд┐рдВрджреВрдВрдирд╛ рдПрдХ рд╡рд╛рдЯрд╛ рджрд┐рд▓рд╛ рдЬрд╛рддреЛ рдЖрдгрд┐ рдЖрдореНрд╣реА рд╕рд░реНрд╡ рдХрдбрд╛ рдкрд╛рд╣рд┐рд▓реНрдпрд╛, рддреЗрд╡реНрд╣рд╛ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдПрдХ рдЪрд╛рдВрдЧрд▓реЗ рд╡рд┐рднрд╛рдЬрди рдЖрд╣реЗ.
рдЧрдгрдиреЗрдЪреА рд╢реБрджреНрдзрддрд╛
Haskell рдордзреНрдпреЗ рдЖрдореНрд╣реА рд╕рд░реНрд╡ рдЧрдгрдирд╛ рдЖрд╣реЗрдд рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рддреЛ рд╕реНрд╡рдЪреНрдЫ. рддрдерд╛рдкрд┐, рдЬрд░ рд╣реЗ рдЦрд░реЛрдЦрд░рдЪ рдШрдбрд▓реЗ рдЕрд╕рддреЗ, рддрд░ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рд╕реНрдХреНрд░реАрдирд╡рд░ рдХрд╛рд╣реАрд╣реА рдореБрджреНрд░рд┐рдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдХреЛрдгрддрд╛рд╣реА рдорд╛рд░реНрдЧ рдирд╕рддрд╛. рдЕрдЬрд┐рдмрд╛рдд, рд╕реНрд╡рдЪреНрдЫ рдЧрдгрдирд╛ рдЗрддрдХреА рдЖрд│рд╢реА рдЖрд╣реЗ рдХреА рдПрдХрд╣реА рдирд╛рд╣реА рд╕реНрд╡рдЪреНрдЫ рдХрд╛рд╣реАрддрд░реА рдореЛрдЬрдгреНрдпрд╛рдЪреА рдХрд╛рд░рдгреЗ. рдкреНрд░реЛрдЧреНрд░рд╛рдордордзреНрдпреЗ рд╣реЛрдгрд╛рд░реА рд╕рд░реНрд╡ рдЧрдгрдирд╛ рдХрд╢реАрддрд░реА рд╕рдХреНрддреА рдХреЗрд▓реА рдЬрд╛рддреЗ "рдЕрд╢реБрджреНрдз" рдореЛрдирд╛рдб рдЖрдпрдУ.
рдореЛрдирд╛рдбреНрд╕ рд╣реЗ рдЧрдгрдиреЗрдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдПрдХ рдорд╛рд░реНрдЧ рдЖрд╣реЗ рдкрд░рд┐рдгрд╛рдо Haskell рдордзреНрдпреЗ. рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдгреЗ рдпрд╛ рдкреЛрд╕реНрдЯрдЪреНрдпрд╛ рд╡реНрдпрд╛рдкреНрддреАрдЪреНрдпрд╛ рдкрд▓реАрдХрдбреЗ рдЖрд╣реЗ. рдЗрдВрдЧреНрд░рдЬреАрдордзреНрдпреЗ рдЪрд╛рдВрдЧрд▓реЗ рдЖрдгрд┐ рд╕реНрдкрд╖реНрдЯ рд╡рд░реНрдгрди рд╡рд╛рдЪрддрд╛ рдпреЗрддреЗ
рдпреЗрдереЗ рдорд▓рд╛ рд╕реВрдЪрд┐рдд рдХрд░рд╛рдпрдЪреЗ рдЖрд╣реЗ рдХреА IO рд╕рд╛рд░рдЦреНрдпрд╛ рдХрд╛рд╣реА рдореЛрдирд╛рдбреНрд╕ рдХрдВрдкрд╛рдпрд▓рд░ рдореЕрдЬрд┐рдХрджреНрд╡рд╛рд░реЗ рдЕрдВрдорд▓рд╛рдд рдЖрдгрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд, рддрд░ рдЗрддрд░ рдЬрд╡рд│рдЬрд╡рд│ рд╕рд░реНрд╡ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░рдордзреНрдпреЗ рд▓рд╛рдЧреВ рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд рдЖрдгрд┐ рддреНрдпрд╛рддреАрд▓ рд╕рд░реНрд╡ рдЧрдгрдирд╛ рд╢реБрджреНрдз рдЖрд╣реЗрдд.
рдмрд░реЗрдЪ рдкреНрд░рднрд╛рд╡ рдЖрд╣реЗрдд рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХрд╛рдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рдореЛрдирд╛рдб рдЖрд╣реЗ. рд╣рд╛ рдПрдХ рдЕрддрд┐рд╢рдп рдордЬрдмреВрдд рдЖрдгрд┐ рд╕реБрдВрджрд░ рд╕рд┐рджреНрдзрд╛рдВрдд рдЖрд╣реЗ: рд╕рд░реНрд╡ рдореЛрдирд╛рдб рд╕рдорд╛рди рдЗрдВрдЯрд░рдлреЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛рдд. рдЖрдкрдг рдкреБрдвреАрд▓ рддреАрди рдореЛрдирд╛рдбреНрд╕рдмрджреНрджрд▓ рдмреЛрд▓реВ.
- рдПрдХрддрд░ ea рд╣реА рдПрдХ рдЧрдгрдирд╛ рдЖрд╣реЗ рдЬреА рдкреНрд░рдХрд╛рд░ a рдЪреЗ рдореВрд▓реНрдп рдорд┐рд│рд╡рддреЗ рдХрд┐рдВрд╡рд╛ рдкреНрд░рдХрд╛рд░ e рдЪрд╛ рдЕрдкрд╡рд╛рдж рдлреЗрдХрддреЗ. рдпрд╛ рдореЛрдирд╛рдбрдЪреЗ рд╡рд░реНрддрди рдЕрддреНрдпрд╛рд╡рд╢реНрдпрдХ рднрд╛рд╖рд╛рдВрдордзреАрд▓ рдЕрдкрд╡рд╛рдж рд╣рд╛рддрд╛рд│рдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ: рддреНрд░реБрдЯреА рдкрдХрдбрд▓реНрдпрд╛ рдЬрд╛рдК рд╢рдХрддрд╛рдд рдХрд┐рдВрд╡рд╛ рдкреБрдвреЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд. рдореБрдЦреНрдп рдлрд░рдХ рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рд╣рд╛рд╕реНрдХреЗрд▓рдордзреАрд▓ рдорд╛рдирдХ рд▓рд╛рдпрдмреНрд░рд░реАрдордзреНрдпреЗ рдореЛрдирд╛рдб рдкреВрд░реНрдгрдкрдгреЗ рддрд╛рд░реНрдХрд┐рдХрд░рд┐рддреНрдпрд╛ рд▓рд╛рдЧреВ рдХреЗрд▓реЗ рдЬрд╛рддреЗ, рддрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдпрдВрддреНрд░рдгрд╛ рд╡рд╛рдкрд░рддрд╛рдд.
- рд╕реНрдЯреЗрдЯ sa рд╣реА рдПрдХ рдЧрдгрдирд╛ рдЖрд╣реЗ рдЬреА рдкреНрд░рдХрд╛рд░ a рдЪреЗ рдореВрд▓реНрдп рдорд┐рд│рд╡рддреЗ рдЖрдгрд┐ рдкреНрд░рдХрд╛рд░ s рдЪреНрдпрд╛ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕реНрдерд┐рддреАрдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ.
- рдХрджрд╛рдЪрд┐рдд рдП. рдХрджрд╛рдЪрд┐рдд рдореЛрдирд╛рдб рдЕрд╢реА рдЧрдгрдирд╛ рд╡реНрдпрдХреНрдд рдХрд░рддреЗ рдЬреА рдХрдзреАрд╣реА рдХрд╛рд╣реАрд╣реА рдкрд░рдд рдХрд░реВрди рд╡реНрдпрддреНрдпрдп рдЖрдгреВ рд╢рдХрддреЗ. рддрдерд╛рдкрд┐, рдЖрдореНрд╣реА рдХрджрд╛рдЪрд┐рдд рдкреНрд░рдХрд╛рд░рд╛рд╕рд╛рдареА рдореЛрдирд╛рдбрдкреНрд▓рд╕ рд╡рд░реНрдЧрд╛рдЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдмрджреНрджрд▓ рдмреЛрд▓реВ, рдЬреЗ рдЙрд▓рдЯ рдкрд░рд┐рдгрд╛рдо рд╡реНрдпрдХреНрдд рдХрд░рддреЗ: рд╣реА рдПрдХ рдЧрдгрдирд╛ рдЖрд╣реЗ рдЬреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореВрд▓реНрдп рдкрд░рдд рдХрд░реВрди рдХрдзреАрд╣реА рд╡реНрдпрддреНрдпрдп рдЖрдгреВ рд╢рдХрддреЗ.
рдЕрд▓реНрдЧреЛрд░рд┐рджрдордЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА
рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЖрд▓реЗрдЦ a рдЖрдгрд┐ Bigraph ab рдЕрд╕реЗ рджреЛрди рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдЖрд╣реЗрдд, рддреНрдпрд╛рддреАрд▓ рдкрд╣рд┐рд▓рд╛ рдкреНрд░рдХрд╛рд░ a рдЪреНрдпрд╛ рдореВрд▓реНрдпрд╛рдВрд╕рд╣ рд▓реЗрдмрд▓ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╢рд┐рд░реЛрдмрд┐рдВрджреВрдВрд╕рд╣ рдЖрд▓реЗрдЦ рджрд░реНрд╢рд╡рддреЛ рдЖрдгрд┐ рджреБрд╕рд░рд╛ рдкреНрд░рдХрд╛рд░ a рдЖрдгрд┐ рдЙрдЬрд╡реАрдХрдбреЗ рд▓реЗрдмрд▓ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдбрд╛рд╡реНрдпрд╛ рдмрд╛рдЬреВрдЪреНрдпрд╛ рд╢рд┐рд░реЛрдмрд┐рдВрджреВрд╕рд╣ рджреНрд╡рд┐рдкрдХреНрд╖реАрдп рдЖрд▓реЗрдЦ рджрд░реНрд╢рд╡рддреЛ. -рд╕рд╛рдЗрдб рд╢рд┐рд░реЛрдмрд┐рдВрджреВ b рдкреНрд░рдХрд╛рд░рд╛рдЪреНрдпрд╛ рдореВрд▓реНрдпрд╛рдВрд╕рд╣ рд▓реЗрдмрд▓ рдХреЗрд▓реЗрд▓реЗ.
рд╣реЗ рдЕрд▓реНрдЧрд╛ рд▓рд╛рдпрдмреНрд░рд░реАрддреАрд▓ рдкреНрд░рдХрд╛рд░ рдирд╛рд╣реАрдд. рдЕрд▓реНрдЧрд╛рдордзреНрдпреЗ рдЕрдирд┐рд░реНрджреЗрд╢рд┐рдд рджреНрд╡рд┐рдкрдХреНрд╖реАрдп рдЖрд▓реЗрдЦрд╛рдВрдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╛рд╣реА. рдореА рд╕реНрдкрд╖реНрдЯрддреЗрд╕рд╛рдареА рдЕрд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЗрд▓реЗ рдЖрд╣реЗрдд.
рдЖрдореНрд╣рд╛рд▓рд╛ рдЦрд╛рд▓реАрд▓ рд╕реНрд╡рд╛рдХреНрд╖рд░реАрдВрд╕рд╣ рдорджрддрдиреАрд╕ рдХрд╛рд░реНрдпреЗ рджреЗрдЦреАрд▓ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗрдд:
-- ╨б╨┐╨╕╤Б╨╛╨║ ╤Б╨╛╤Б╨╡╨┤╨╡╨╣ ╨┤╨░╨╜╨╜╨╛╨╣ ╨▓╨╡╤А╤И╨╕╨╜╤Л.
neighbours :: Ord a => a -> Graph a -> [a]
-- ╨Я╨╛╤Б╤В╤А╨╛╨╕╤В╤М ╨┤╨▓╤Г╨┤╨╛╨╗╤М╨╜╤Л╨╣ ╨│╤А╨░╤Д ╨┐╨╛ ╨│╤А╨░╤Д╤Г ╨╕ ╤Д╤Г╨╜╨║╤Ж╨╕╨╕, ╨┤╨╗╤П ╨║╨░╨╢╨┤╨╛╨╣ ╨▓╨╡╤А╤И╨╕╨╜╤Л
-- ╨▓╤Л╨┤╨░╤О╤Й╨╡╨╣ ╨╡╤С ╨┤╨╛╨╗╤О ╨╕ ╨┐╨╛╨╝╨╡╤В╨║╤Г ╨▓ ╨╜╨╛╨▓╨╛╨╣ ╨┤╨╛╨╗╨╡, ╨╕╨│╨╜╨╛╤А╨╕╤А╤Г╤П ╨║╨╛╨╜╤Д╨╗╨╕╨║╤В╨╜╤Л╨╡ ╤А╤С╨▒╤А╨░.
toBipartiteWith :: (Ord a, Ord b, Ord c) => (a -> Either b c)
-> Graph a
-> Bigraph b c
-- ╨б╨┐╨╕╤Б╨╛╨║ ╨▓╨╡╤А╤И╨╕╨╜ ╨▓ ╨│╤А╨░╤Д╨╡
vertexList :: Ord a => Graph a -> [a]
╨б╨╕╨│╨╜╨░╤В╤Г╤А╨░ ╤Д╤Г╨╜╨║╤Ж╨╕╨╕, ╨║╨╛╤В╨╛╤А╤Г╤О ╨╝╤Л ╨▒╤Г╨┤╨╡╨╝ ╨┐╨╕╤Б╨░╤В╤М, ╨▓╤Л╨│╨╗╤П╨┤╨╕╤В ╤В╨░╨║:
type OddCycle a = [a]
detectParts :: Ord a => Graph a -> Either (OddCycle a) (Bigraph a a)
рд╣реЗ рдкрд╛рд╣рдгреЗ рд╕реЛрдкреЗ рдЖрд╣реЗ рдХреА рдЦреЛрд▓реА-рдкреНрд░рдердо рд╢реЛрдз рджрд░рдореНрдпрд╛рди рдЖрдореНрд╣рд╛рд▓рд╛ рдкрд░рд╕реНрдкрд░рд╡рд┐рд░реЛрдзреА рдХрд┐рдирд╛рд░ рдЖрдврд│рд▓реНрдпрд╛рд╕, рд╡рд┐рдЪрд┐рддреНрд░ рдЪрдХреНрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддреА рд╕реНрдЯреЕрдХрдЪреНрдпрд╛ рд╢реАрд░реНрд╖рд╕реНрдерд╛рдиреА рдЖрд╣реЗ. рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рддреЗ рдкреБрдирд░реНрд╕рдВрдЪрдпрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддреА рд╕реНрдЯреЕрдХрдкрд╛рд╕реВрди рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рд╢рд┐рд░реЛрдмрд┐рдВрджреВрдЪреНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рдШрдЯрдиреЗрдкрд░реНрдпрдВрдд рд╕рд░реНрд╡ рдХрд╛рд╣реА рдХрд╛рдкрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ.
рдЖрдореНрд╣реА рдкреНрд░рддреНрдпреЗрдХ рд╢рд┐рд░реЛрдмрд┐рдВрджреВрд╕рд╛рдареА рд╢реЗрдЕрд░ рд╕рдВрдЦреНрдпрд╛рдВрдЪреНрдпрд╛ рд╕рд╣рдпреЛрдЧреА ре▓рд░реЗ рд░рд╛рдЦреВрди рд╕рдЦреЛрд▓-рдкреНрд░рдердо рд╢реЛрдз рд▓рд╛рдЧреВ рдХрд░рддреЛ. рдЖрдореНрд╣реА рдирд┐рд╡рдбрд▓реНрдпрд╛ рдореЛрдирд╛рдбрдЪреНрдпрд╛ рдлрдВрдХреНрдЯрд░ рдХреНрд▓рд╛рд╕рдЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрджреНрд╡рд╛рд░реЗ рд░рд┐рдХрд░реНрд╕рди рд╕реНрдЯреЕрдХ рдЖрдкреЛрдЖрдк рд░рд╛рдЦрд▓рд╛ рдЬрд╛рдИрд▓: рдЖрдореНрд╣рд╛рд▓рд╛ рд░рд┐рдХрд░реНрд╕рд┐рд╡реНрд╣ рдлрдВрдХреНрд╢рдирдордзреВрди рдорд┐рд│рд╛рд▓реЗрд▓реНрдпрд╛ рд░рд┐рдЭрд▓реНрдЯрдордзреНрдпреЗ рдкрд╛рдердордзреАрд▓ рд╕рд░реНрд╡ рд╢рд┐рд░реЛрдмрд┐рдВрджреВ рдареЗрд╡рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓.
рдПрдХрддрд░ рдореЛрдирд╛рдб рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдорд╛рдЭреА рдкрд╣рд┐рд▓реА рдХрд▓реНрдкрдирд╛ рд╣реЛрддреА, рдЬреА рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рднрд╛рд╡рд╛рдВрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХрд░рддреЗ рдЕрд╕реЗ рджрд┐рд╕рддреЗ. рдореА рд▓рд┐рд╣рд┐рд▓реЗрд▓реА рдкрд╣рд┐рд▓реА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдпрд╛ рдкрд░реНрдпрд╛рдпрд╛рдЪреНрдпрд╛ рдЕрдЧрджреА рдЬрд╡рд│ рд╣реЛрддреА. рдЦрд░рдВ рддрд░, рдорд╛рдЭреНрдпрд╛рдХрдбреЗ рдПрдХрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рдкрд╛рдЪ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд╣реЛрддреНрдпрд╛ рдЖрдгрд┐ рд╢реЗрд╡рдЯреА рджреБрд╕рд▒реНрдпрд╛рд╡рд░ рд╕реЗрдЯрд▓ рдЭрд╛рд▓реЛ.
рдкреНрд░рдердо, рдЖрдореНрд╣рд╛рд▓рд╛ рд╢реЗрдЕрд░ рдЖрдпрдбреЗрдВрдЯрд┐рдлрд╛рдпрд░рдЪрд╛ рдПрдХ рд╕рд╣рдпреЛрдЧреА ре▓рд░реЗ рд░рд╛рдЦрдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдЖрд╣реЗ - рд╣реЗ рд░рд╛рдЬреНрдпрд╛рдмрджреНрджрд▓ рдХрд╛рд╣реАрддрд░реА рдЖрд╣реЗ. рджреБрд╕рд░реЗ рдореНрд╣рдгрдЬреЗ, рдЬреЗрд╡реНрд╣рд╛ рд╕рдВрдШрд░реНрд╖ рдЖрдврд│рддреЛ рддреЗрд╡реНрд╣рд╛ рдЖрдкрдг рдерд╛рдВрдмрдгреНрдпрд╛рд╕ рд╕рдХреНрд╖рдо рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╣реЗ рдПрдХрддрд░ рдПрдХрддрд░ рдореЛрдирд╛рдб рдХрд┐рдВрд╡рд╛ рдХрджрд╛рдЪрд┐рдд рдореЛрдирд╛рдбрдкреНрд▓рд╕ рдЕрд╕реВ рд╢рдХрддреЗ. рдореБрдЦреНрдп рдлрд░рдХ рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рдЬрд░ рдЧрдгрдирд╛ рдерд╛рдВрдмрд╡рд┐рд▓реА рдЧреЗрд▓реА рдирд╕реЗрд▓ рддрд░ рдПрдХрддрд░ рдореВрд▓реНрдп рдкрд░рдд рдХрд░реВ рд╢рдХрддреЗ рдЖрдгрд┐ рдХрджрд╛рдЪрд┐рдд рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рдлрдХреНрдд рдпрд╛рдмрджреНрджрд▓ рдорд╛рд╣рд┐рддреА рдкрд░рдд рдХрд░реЗрд▓. рдЖрдореНрд╣рд╛рд▓рд╛ рдпрд╢рд╛рд╕рд╛рдареА рд╡реЗрдЧрд│реНрдпрд╛ рдореВрд▓реНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╕рд▓реНрдпрд╛рдореБрд│реЗ (рддреЗ рдЖрдзреАрдЪ рд░рд╛рдЬреНрдпрд╛рдд рд╕рдВрдЧреНрд░рд╣рд┐рдд рдЖрд╣реЗ), рдЖрдореНрд╣реА рдХрджрд╛рдЪрд┐рдд рдирд┐рд╡рдбрддреЛ. рдЖрдгрд┐ рдпрд╛ рдХреНрд╖рдгреА рдЬреЗрд╡реНрд╣рд╛ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рджреЛрди рдореЛрдирд╛рдбреНрд╕рдЪреЗ рдкрд░рд┐рдгрд╛рдо рдПрдХрддреНрд░ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рддреЗ рддреЗрд╡реНрд╣рд╛ рддреЗ рдмрд╛рд╣реЗрд░ рдпреЗрддрд╛рдд
рдореА рдЗрддрдХрд╛ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд╡рдбрд▓рд╛? рджреЛрди рдХрд╛рд░рдгреЗ. рдкреНрд░рдердо, рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдЕрддреНрдпрд╛рд╡рд╢реНрдпрдХ рд╕рд╛рд░рдЦреАрдЪ рдЕрд╕рд▓реНрдпрд╛рдЪреЗ рджрд┐рд╕реВрди рдпреЗрддреЗ. рджреБрд╕рд░реЗ, рд╡рд┐рдЪрд┐рддреНрд░ рд▓реВрдк рдкреБрдирд░реНрд╕рдВрдЪрдпрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреБрдирд░рд╛рд╡реГрддреНрддреАрд╡рд░реВрди рдкрд░рдд рдпреЗрддрд╛рдирд╛ рд╕рдВрдШрд░реНрд╖рд╛рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд рдЖрдореНрд╣рд╛рд▓рд╛ рдкрд░рддрд╛рд╡рд╛ рдореВрд▓реНрдп рд╣рд╛рддрд╛рд│рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ, рдЬреЗ рдХрджрд╛рдЪрд┐рдд рдореЛрдирд╛рдбрдордзреНрдпреЗ рдХрд░рдгреЗ рдЦреВрдк рд╕реЛрдкреЗ рдЖрд╣реЗ.
рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рд╣реА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдорд┐рд│рддреЗ.
{-# LANGUAGE ExplicitForAll #-}
{-# LANGUAGE ScopedTypeVariables #-}
data Part = LeftPart | RightPart
otherPart :: Part -> Part
otherPart LeftPart = RightPart
otherPart RightPart = LeftPart
type PartMap a = Map.Map a Part
type OddCycle a = [a]
toEither :: Ord a => PartMap a -> a -> Either a a
toEither m v = case fromJust (v `Map.lookup` m) of
LeftPart -> Left v
RightPart -> Right v
type PartMonad a = MaybeT (State (PartMap a)) [a]
detectParts :: forall a. Ord a => Graph a -> Either (OddCycle a) (Bigraph a a)
detectParts g = case runState (runMaybeT dfs) Map.empty of
(Just c, _) -> Left $ oddCycle c
(Nothing, m) -> Right $ toBipartiteWith (toEither m) g
where
inVertex :: Part -> a -> PartMonad a
inVertex p v = ((:) v) <$> do modify $ Map.insert v p
let q = otherPart p
msum [ onEdge q u | u <- neigbours v g ]
{-# INLINE onEdge #-}
onEdge :: Part -> a -> PartMonad a
onEdge p v = do m <- get
case v `Map.lookup` m of
Nothing -> inVertex p v
Just q -> do guard (q /= p)
return [v]
processVertex :: a -> PartMonad a
processVertex v = do m <- get
guard (v `Map.notMember` m)
inVertex LeftPart v
dfs :: PartMonad a
dfs = msum [ processVertex v | v <- vertexList g ]
oddCycle :: [a] -> [a]
oddCycle c = tail (dropWhile ((/=) last c) c)
рдЬреЗрдереЗ рдмреНрд▓реЙрдХ рд╣рд╛ рдЕрд▓реНрдЧреЛрд░рд┐рджрдордЪрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рдЖрд╣реЗ. рдореА рддреНрдпрд╛рдЪреНрдпрд╛ рдЖрдд рдХрд╛рдп рдШрдбрдд рдЖрд╣реЗ рддреЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реЗрди.
- inVertex рд╣рд╛ depth-first search рдЪрд╛ рднрд╛рдЧ рдЖрд╣реЗ рдЬрд┐рдереЗ рдЖрдкрдг рдкреНрд░рдердордЪ рд╢рд┐рд░реЛрдмрд┐рдВрджреВрд▓рд╛ рднреЗрдЯ рджреЗрддреЛ. рдпреЗрдереЗ рдЖрдореНрд╣реА рд╢рд┐рд░реЛрдмрд┐рдВрджреВрд▓рд╛ рдПрдХ рд╢реЗрдЕрд░ рдХреНрд░рдорд╛рдВрдХ рдирд┐рдпреБрдХреНрдд рдХрд░рддреЛ рдЖрдгрд┐ рд╕рд░реНрд╡ рд╢реЗрдЬрд╛рд▒реНрдпрд╛рдВрд╡рд░ onEdge рдЪрд╛рд▓рд╡рддреЛ. рдпреЗрдереЗ рджреЗрдЦреАрд▓ рдЖрдореНрд╣реА рдХреЙрд▓ рд╕реНрдЯреЕрдХ рдкреБрдирд░реНрд╕рдВрдЪрдпрд┐рдд рдХрд░рддреЛ: рдЬрд░ msum рдиреЗ рдореВрд▓реНрдп рдкрд░рдд рдХреЗрд▓реЗ, рддрд░ рдЖрдореНрд╣реА рд╡реНрд╣рд░реНрдЯреЗрдХреНрд╕ v рддреЗрдереЗ рджрд╛рдмрддреЛ.
- onEdge рд╣рд╛ рднрд╛рдЧ рдЖрд╣реЗ рдЬрд┐рдереЗ рдЖрдкрдг рдХрд╛рдард╛рд▓рд╛ рднреЗрдЯ рджреЗрддреЛ. рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рдард╛рд╕рд╛рдареА рджреЛрдирджрд╛ рдореНрд╣рдЯрд▓реЗ рдЬрд╛рддреЗ. рдпреЗрдереЗ рдЖрдкрдг рджреБрд╕рд▒реНрдпрд╛ рдмрд╛рдЬреВрдЪреНрдпрд╛ рд╢рд┐рд░реЛрдмрд┐рдВрджреВрд▓рд╛ рднреЗрдЯ рджрд┐рд▓реА рдЖрд╣реЗ рдХрд╛ рддреЗ рддрдкрд╛рд╕рддреЛ рдЖрдгрд┐ рдирд╕рд▓реНрдпрд╛рд╕ рддреНрдпрд╛рд╕ рднреЗрдЯ рджреЗрддреЛ. рднреЗрдЯ рджрд┐рд▓реНрдпрд╛рд╕, рдХрд╛рда рдкрд░рд╕реНрдкрд░рд╡рд┐рд░реЛрдзреА рдЖрд╣реЗ рдХрд╛ рддреЗ рдЖрдореНрд╣реА рддрдкрд╛рд╕рддреЛ. рдЕрд╕реЗ рдЕрд╕рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рдореВрд▓реНрдп рдкрд░рдд рдХрд░рддреЛ - рдкреБрдирд░рд╛рд╡реГрддреНрддреА рд╕реНрдЯреЕрдХрдЪреНрдпрд╛ рдЕрдЧрджреА рд╡рд░рдЪреНрдпрд╛ рднрд╛рдЧрд╛рд╡рд░, рдЬреЗрдереЗ рдЗрддрд░ рд╕рд░реНрд╡ рд╢рд┐рд░реЛрдмрд┐рдВрджреВ рдкрд░рдд рдЖрд▓реНрдпрд╛рд╡рд░ рдареЗрд╡рд▓реНрдпрд╛ рдЬрд╛рддреАрд▓.
- processVertex рдкреНрд░рддреНрдпреЗрдХ рд╢рд┐рд░реЛрдмрд┐рдВрджреВрд▓рд╛ рднреЗрдЯ рджрд┐рд▓реА рдЖрд╣реЗ рдХреА рдирд╛рд╣реА рддреЗ рддрдкрд╛рд╕рддреЗ рдЖрдгрд┐ рдирд╕рд▓реНрдпрд╛рд╕ рддреНрдпрд╛рд╡рд░ рдЗрдирд╡реНрд╣рд░реНрдЯреЗрдХреНрд╕ рдЪрд╛рд▓рд╡рддреЗ.
- dfs рд╕рд░реНрд╡ рд╢рд┐рд░реЛрдмрд┐рдВрджреВрдВрд╡рд░ processVertex рдЪрд╛рд▓рд╡рддреЗ.
рдПрд╡рдвреЗрдЪ.
рдЗрдирд▓рд╛рдЗрди рд╢рдмреНрджрд╛рдЪрд╛ рдЗрддрд┐рд╣рд╛рд╕
INLINE рд╣рд╛ рд╢рдмреНрдж рдЕрд▓реНрдЧреЛрд░рд┐рджрдордЪреНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдордзреНрдпреЗ рдирд╡реНрд╣рддрд╛; рддреЛ рдирдВрддрд░ рджрд┐рд╕рд▓рд╛. рдЬреЗрд╡реНрд╣рд╛ рдореА рдПрдХ рдЪрд╛рдВрдЧрд▓реА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд╢реЛрдзрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓рд╛, рддреЗрд╡реНрд╣рд╛ рдорд▓рд╛ рдЖрдврд│рд▓реЗ рдХреА рдЧреИрд░-рдЗрдирд▓рд╛рдЗрди рдЖрд╡реГрддреНрддреА рдХрд╛рд╣реА рдЖрд▓реЗрдЦрд╛рдВрд╡рд░ рд▓рдХреНрд╖рдгреАрдпрдкрдгреЗ рд╣рд│реВ рд╣реЛрддреА. рд╕рд┐рдореЗрдВрдЯрд┐рдХрд▓реА рдлрдВрдХреНрд╢рдиреНрд╕ рд╕рд╛рд░рдЦреАрдЪ рдЪрд╛рд▓рд▓реА рдкрд╛рд╣рд┐рдЬреЗрдд рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдШреЗрдКрди, рдорд▓рд╛ рдЦреВрдк рдЖрд╢реНрдЪрд░реНрдп рд╡рд╛рдЯрд▓реЗ. рдЕрдЧрджреА рдЕрдиреЛрд│рдЦреА, GHC рдЪреА рднрд┐рдиреНрди рдЖрд╡реГрддреНрддреА рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рджреБрд╕рд▒реНрдпрд╛ рдорд╢реАрдирд╡рд░ рд▓рдХреНрд╖рдгреАрдп рдлрд░рдХ рдирд╡реНрд╣рддрд╛.
GHC рдХреЛрд░ рдЖрдЙрдЯрдкреБрдЯ рд╡рд╛рдЪрдгреНрдпрд╛рдд рдПрдХ рдЖрдард╡рдбрд╛ рдШрд╛рд▓рд╡рд▓реНрдпрд╛рдирдВрддрд░, рдореА рд╕реНрдкрд╖реНрдЯ INLINE рдЪреНрдпрд╛ рдПрдХрд╛ рдУрд│реАрдиреЗ рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рдд рд╕рдХреНрд╖рдо рдЭрд╛рд▓реЛ. GHC 8.4.4 рдЖрдгрд┐ GHC 8.6.5 рдордзреАрд▓ рдХрд╛рд╣реА рдХреНрд╖рдгреА рдСрдкреНрдЯрд┐рдорд╛рдпрдЭрд░рдиреЗ рд╣реЗ рд╕реНрд╡рддрдГрд╣реВрди рдХрд░рдгреЗ рдерд╛рдВрдмрд╡рд▓реЗ.
рд╣реЕрд╕реНрдХреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧрдордзреНрдпреЗ рдЕрд╢реА рдШрд╛рдг рдпреЗрдгреНрдпрд╛рдЪреА рдорд▓рд╛ рдЕрдкреЗрдХреНрд╖рд╛ рдирд╡реНрд╣рддреА. рддрдерд╛рдкрд┐, рдЖрдЬрд╣реА, рдСрдкреНрдЯрд┐рдорд╛рдпрдЭрд░ рдХрдзреАрдХрдзреА рдЪреБрдХрд╛ рдХрд░рддрд╛рдд рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рд╕реВрдЪрдирд╛ рджреЗрдгреЗ рд╣реЗ рдЖрдордЪреЗ рдХрд╛рдо рдЖрд╣реЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдпреЗрдереЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ рдХреА рдлрдВрдХреНрд╢рди рдЗрдирд▓рд╛рдЗрди рдХреЗрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ рдХрд╛рд░рдг рддреЗ рдЕрддреНрдпрд╛рд╡рд╢реНрдпрдХ рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ рдЗрдирд▓рд╛рдЗрди рдХреЗрд▓реЗрд▓реЗ рдЖрд╣реЗ рдЖрдгрд┐ рд╣реЗ рдХрдВрдкрд╛рдЗрд▓рд░рд▓рд╛ рдПрдХ рдЗрд╢рд╛рд░рд╛ рджреЗрдгреНрдпрд╛рдЪреЗ рдХрд╛рд░рдг рдЖрд╣реЗ.
рдкреБрдвреЗ рдХрд╛рдп рдЭрд╛рд▓реЗ?
рдордЧ рдореА рд╣реЙрдкрдХреНрд░реЙрдлреНрдЯ-рдХрд╛рд░реНрдк рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рдЗрддрд░ рдореЛрдирд╛рдбреНрд╕рд╕рд╣ рд▓рд╛рдЧреВ рдХреЗрд▓реЗ рдЖрдгрд┐ рддреЛ рдХрд╛рд░реНрдпрдХреНрд░рдорд╛рдЪрд╛ рд╢реЗрд╡рдЯ рдЭрд╛рд▓рд╛.
Google рд╕рдорд░ рдСрдл рдХреЛрдбрдмрджреНрджрд▓ рдзрдиреНрдпрд╡рд╛рдж, рдорд▓рд╛ рдлрдВрдХреНрд╢рдирд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧрдЪрд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрднрд╡ рдорд┐рд│рд╛рд▓рд╛, рдЬреНрдпрд╛рдиреЗ рдорд▓рд╛ рдкреБрдвреАрд▓ рдЙрдиреНрд╣рд╛рд│реНрдпрд╛рдд рдЬреЗрди рд╕реНрдЯреНрд░реАрдЯрд╡рд░ рдЗрдВрдЯрд░реНрдирд╢рд┐рдк рдорд┐рд│рд╡рд┐рдгреНрдпрд╛рдд рдорджрдд рдХреЗрд▓реА рдирд╛рд╣реА (рдорд▓рд╛ рдЦрд╛рддреНрд░реА рдирд╛рд╣реА рдХреА рд╣реЗ рдард┐рдХрд╛рдг рд╣реЕрдмреНрд░рдЪреНрдпрд╛ рдЬрд╛рдгрдХрд╛рд░ рдкреНрд░реЗрдХреНрд╖рдХрд╛рдВрдордзреНрдпреЗрд╣реА рдХрд┐рддреА рдкреНрд░рд╕рд┐рджреНрдз рдЖрд╣реЗ, рдкрд░рдВрддреБ рд╣реЗ рдПрдХ рдЖрд╣реЗ. рдлрдВрдХреНрд╢рдирд▓ рдкреНрд░реЛрдЧреНрд░реЕрдорд┐рдВрдЧрдордзреНрдпреЗ рдЧреБрдВрддрдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣реА рдЙрдиреНрд╣рд╛рд│реНрдпрд╛рдд рд░рд╛рд╣реВ рд╢рдХрддрд╛ рдЕрд╢рд╛ рдХрд╛рд╣реАрдкреИрдХреА), рдкрд░рдВрддреБ рдкрд╛рд░рдВрдкрд╛рд░рд┐рдХ рднрд╛рд╖рд╛рдВрдордзреАрд▓ рдорд╛рдЭреНрдпрд╛ рдЕрдиреБрднрд╡рд╛рдкреЗрдХреНрд╖рд╛ рд▓рдХреНрд╖рдгреАрдп рднрд┐рдиреНрди, рд╕рд░рд╛рд╡рд╛рдд рд╣рд╛ рдирдореБрдирд╛ рд▓рд╛рдЧреВ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдЕрджреНрднреВрдд рдЬрдЧрд╛рдЪреА рдорд▓рд╛ рдУрд│рдЦ рдХрд░реВрди рджрд┐рд▓реА.
рд╕реНрддреНрд░реЛрдд: www.habr.com