GSoC 2019: рджреНрд╡рд┐рдкрдХреНрд╖реАрдпрддрд╛ рдЖрдгрд┐ рдореЛрдирд╛рдб рдЯреНрд░рд╛рдиреНрд╕рдлреЙрд░реНрдорд░рд╕рд╛рдареА рдЖрд▓реЗрдЦ рддрдкрд╛рд╕рдд рдЖрд╣реЗ

рдЧреЗрд▓реНрдпрд╛ рдЙрдиреНрд╣рд╛рд│реНрдпрд╛рдд рдореА рднрд╛рдЧ рдШреЗрддрд▓рд╛ рдХреЛрдб рд╕рдорд░ рдСрдл рдХреЛрдб - Google рд╡рд░реАрд▓ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдВрд╕рд╛рдареА рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо. рджрд░рд╡рд░реНрд╖реА, рдЖрдпреЛрдЬрдХ рдЕрдиреЗрдХ рдореБрдХреНрдд рд╕реНрд░реЛрдд рдкреНрд░рдХрд▓реНрдк рдирд┐рд╡рдбрддрд╛рдд, рдЬреНрдпрд╛рдд рдЕрд╢рд╛ рд╕реБрдкреНрд░рд╕рд┐рджреНрдз рд╕рдВрд╕реНрдерд╛рдВрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЖрд╣реЗ Boost.org ╨╕ рд▓рд┐рдирдХреНрд╕ рдлрд╛рдКрдВрдбреЗрд╢рди. Google рдЬрдЧрднрд░рд╛рддреАрд▓ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдВрдирд╛ рдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдВрд╡рд░ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддреЗ. 

Google рд╕рдорд░ рдСрдл рдХреЛрдб 2019 рдордзреНрдпреЗ рд╕рд╣рднрд╛рдЧреА рдореНрд╣рдгреВрди, рдореА рд▓рд╛рдпрдмреНрд░рд░реАрдордзреНрдпреЗ рдПрдХ рдкреНрд░рдХрд▓реНрдк рдХреЗрд▓рд╛ рдЕрд▓реНрдЧрд╛ рд╕рдВрд╕реНрдереЗрд╕рд╣ Haskell.org, рдЬреА рд╣рд╛рд╕реНрдХреЗрд▓ рднрд╛рд╖рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдд рдЖрд╣реЗ - рд╕рд░реНрд╡рд╛рдд рдкреНрд░рд╕рд┐рджреНрдз рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдВрдкреИрдХреА рдПрдХ. рдЕрд▓реНрдЧрд╛ рдПрдХ рд▓рд╛рдпрдмреНрд░рд░реА рдЖрд╣реЗ рдЬреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдЯрд╛рдЗрдк рдХрд░рд╛ рд╣рд╛рд╕реНрдХреЗрд▓рдордзреАрд▓ рдЖрд▓реЗрдЦрд╛рдВрдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡. рд╣реЗ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдордзреНрдпреЗ рдЕрд░реНрдердкреВрд░реНрдг тАФ рдПрдХ рдЧрд┐рдердм рд▓рд╛рдпрдмреНрд░рд░реА рдЬреА рдХреЛрдбрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдЯреНрд░реА, рдХреЙрд▓ рдЖрдгрд┐ рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рдЖрд▓реЗрдЦ рддрдпрд╛рд░ рдХрд░рддреЗ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреА рддреБрд▓рдирд╛ рдХрд░реВ рд╢рдХрддреЗ. рдорд╛рдЭрд╛ рдкреНрд░рдХрд▓реНрдк рджреНрд╡рд┐рдкрдХреНрд╖реАрдп рдЖрд▓реЗрдЦ рдЖрдгрд┐ рддреНрдпрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡рд╛рд╕рд╛рдареА рдЕрд▓реНрдЧреЛрд░рд┐рджрдорд╕рд╛рдареА рдПрдХ рдкреНрд░рдХрд╛рд░-рд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЬреЛрдбрдгреНрдпрд╛рдЪрд╛ рд╣реЛрддрд╛. 

рдпрд╛ рдкреЛрд╕реНрдЯрдордзреНрдпреЗ рдореА рд╣реЕрд╕реНрдХреЗрд▓рдордзреАрд▓ рджреНрд╡рд┐рдкрдХреНрд╖реАрдпрддреЗрд╕рд╛рдареА рдЖрд▓реЗрдЦ рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рдЕрд▓реНрдЧреЛрд░рд┐рджрдордЪреНрдпрд╛ рдорд╛рдЭреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдмрджреНрджрд▓ рдмреЛрд▓реЗрди. рдЬрд░реА рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реЗ рд╕рд░реНрд╡рд╛рдд рдореВрд▓рднреВрдд рдЕрд╕рд▓реЗ рддрд░реА, рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реАрдордзреНрдпреЗ рддреЗ рд╕реБрдВрджрд░рдкрдгреЗ рдЕрдВрдорд▓рд╛рдд рдЖрдгрдгреНрдпрд╛рд╕рд╛рдареА рдорд▓рд╛ рдЕрдиреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддреА рдЭрд╛рд▓реА рдЖрдгрд┐ рдЦреВрдк рдХрд╛рдо рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрд▓реЗ. рдкрд░рд┐рдгрд╛рдореА, рдореА рдореЛрдирд╛рдб рдЯреНрд░рд╛рдиреНрд╕рдлреЙрд░реНрдорд░рд╕рд╣ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрд╡рд░ рд╕реНрдерд╛рдпрд┐рдХ рдЭрд╛рд▓реЛ. 

GSoC 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛