GSoC 2019: рджреНрд╡рд┐рдкрдХреНрд╖реАрдпрддрд╛ рд░ рдореЛрдирд╛рдб рдЯреНрд░рд╛рдиреНрд╕рдлрд░реНрдорд░рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЧреНрд░рд╛рдлрд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реНрджреИ

рдЧрдд рдЧрд░реНрдореАрдорд╛ рдореИрд▓реЗ рднрд╛рдЧ рд▓рд┐рдПрдБ рдЧреБрдЧрд▓ рд╕рдорд░ рдХреЛрдб - Google рдмрд╛рдЯ рд╡рд┐рджреНрдпрд╛рд░реНрдереАрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдПрдЙрдЯрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдоред рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрд╖, рдЖрдпреЛрдЬрдХрд╣рд░реВрд▓реЗ рдзреЗрд░реИ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВ рдЪрдпрди рдЧрд░реНрдЫрдиреН, рдЬрд╕рдорд╛ рддреНрдпрд╕реНрддрд╛ рдкреНрд░рд╕рд┐рджреНрдз рд╕рдВрд╕реНрдерд╛рд╣рд░реВрдмрд╛рдЯ рдкрдирд┐ рд╕рдорд╛рд╡реЗрд╢ рдЫрдиреН Boost.org ╨╕ рд▓рд┐рдирдХреНрд╕ рдлрд╛рдЙрдиреНрдбреЗрд╕рдиред Google рд▓реЗ рд╕рдВрд╕рд╛рд░рднрд░рдХрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдереАрд╣рд░реВрд▓рд╛рдИ рдпреА рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдорд╛ рдХрд╛рдо рдЧрд░реНрди рдЖрдордиреНрддреНрд░рд┐рдд рдЧрд░реНрджрдЫред 

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

рдпрд╕ рдкреЛрд╖реНрдЯрдорд╛ рдо рд╣рд╕реНрдХреЗрд▓рдорд╛ рджреНрд╡рд┐рдкрдХреНрд╖реАрдпрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЧреНрд░рд╛рдл рдЬрд╛рдБрдЪ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрд▓реНрдЧреЛрд░рд┐рджрдордХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреБред рдпрджреНрдпрдкрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рдмреИрднрдиреНрджрд╛ рдЖрдзрд╛рд░рднреВрдд рдордзреНрдпреЗ рдПрдХ рд╣реЛ, рдпрд╕рд▓рд╛рдИ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реАрдорд╛ рд╕реБрдиреНрджрд░ рдврдВрдЧрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдирд▓реЗ рдорд▓рд╛рдИ рдзреЗрд░реИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рд╣рд░реВ рд▓рд┐рдпреЛ рд░ рдзреЗрд░реИ рдХрд╛рдордХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдерд┐рдпреЛред рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рдо рдореЛрдирд╛рдб рдЯреНрд░рд╛рдиреНрд╕рдлрд░реНрдорд░рдХреЛ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдорд╛ рдмрд╕реЗред 

GSoC 2019: рджреНрд╡рд┐рдкрдХреНрд╖реАрдпрддрд╛ рд░ рдореЛрдирд╛рдб рдЯреНрд░рд╛рдиреНрд╕рдлрд░реНрдорд░рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЧреНрд░рд╛рдлрд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реНрджреИ

рдореЗрд░реЛ рдмрд╛рд░реЗрдорд╛

рдореЗрд░реЛ рдирд╛рдо Vasily Alferov рд╣реЛ, рдо рд╕реЗрдиреНрдЯ рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ HSE рдорд╛ рдЪреМрдереЛ рд╡рд░реНрд╖рдХреЛ рд╡рд┐рджреНрдпрд╛рд░реНрдереА рд╣реБрдБред рдкрд╣рд┐рд▓реЗ рдмреНрд▓рдЧрдорд╛ рд▓реЗрдЦреЗрдХреЛ рдерд┐рдПрдБ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╛рдЗрдЬреНрдб рдПрд▓реНрдЧреЛрд░рд┐рджрдордХреЛ рдмрд╛рд░реЗрдорд╛ рдореЗрд░реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рдмрд╛рд░реЗрдорд╛ ╨╕ ZuriHac рдХреЛ рдпрд╛рддреНрд░рд╛ рдХреЛ рдмрд╛рд░реЗ рдорд╛ред рдЕрд╣рд┐рд▓реЗ рдо рдЗрдиреНрдЯрд░реНрдирд╢рд┐рдкрдорд╛ рдЫреБ рдмрд░реНрдЧрди рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдирд░реНрд╡реЗ рдорд╛, рдЬрд╣рд╛рдБ рдо рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдорд╛ рдХрд╛рдо рдЧрд░реНрджреИрдЫреБ рд╕реВрдЪреА рд░рдЩред рдореЗрд░реЛ рд░реБрдЪрд┐рд╣рд░реВрдорд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╛рдЗрдЬреНрдб рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ рд╕рдорд╛рд╡реЗрд╢ рдЫред

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╛рд░реЗ

Foreword

рдХрд╛рд░реНрдпрдХреНрд░рдордорд╛ рд╕рд╣рднрд╛рдЧреА рд╡рд┐рджреНрдпрд╛рд░реНрдереАрд╣рд░реВрд▓рд╛рдИ рдмреНрд▓рдЧ рдЧрд░реНрди рджреГрдврддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдЧрд░рд┐рдиреНрдЫред рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдорд▓рд╛рдИ рдмреНрд▓рдЧрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд▓реЗрдЯрдлрд░реНрдо рдкреНрд░рджрд╛рди рдЧрд░реЗ Haskell рдХреЛ рдЧрд░реНрдореАред рдпреЛ рд▓реЗрдЦ рдЕрдиреБрд╡рд╛рдж рд╣реЛ рд▓реЗрдЦ, рдореИрд▓реЗ рддреНрдпрд╣рд╛рдБ рдЬреБрд▓рд╛рдИрдорд╛ рдЕрдВрдЧреНрд░реЗрдЬреАрдорд╛ рд▓реЗрдЦреЗрдХреЛ, рдЫреЛрдЯреЛ рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛рдХреЛ рд╕рд╛рдеред 

рдкреНрд░рд╢реНрдирдорд╛ рдХреЛрдбрдХреЛ рд╕рд╛рде рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫ рдпрд╣рд╛рдБ.

рддрдкрд╛рдИрд▓реЗ рдореЗрд░реЛ рдХрд╛рдордХреЛ рдирддрд┐рдЬрд╛рд╣рд░реВ рдкрдвреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ (рдЕрдВрдЧреНрд░реЗрдЬреАрдорд╛) рдпрд╣рд╛рдБ.

рдпреЛ рдкреЛрд╖реНрдЯрд▓реЗ рдкрд╛рдардХрд▓рд╛рдИ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩрдорд╛ рдЖрдзрд╛рд░рднреВрдд рдЕрд╡рдзрд╛рд░рдгрд╛рд╣рд░реВрд╕рдБрдЧ рдкрд░рд┐рдЪрд┐рдд рдЫ рднрдиреА рдорд╛рдиреНрджрдЫ, рдпрджреНрдпрдкрд┐ рдо рд╕рдордп рдЖрдЙрдБрджрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХрд╛ рд╕рдмреИ рд╕рд░реНрддрд╣рд░реВ рд╕рдореНрдЭрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреЗрдЫреБред

рджреНрд╡рд┐рдкрдХреНрд╖реАрдпрддрд╛рдХрд╛ рд▓рд╛рдЧрд┐ рдЧреНрд░рд╛рдлрд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реНрджреИ 

рджреНрд╡рд┐рдкрдХреНрд╖реАрдпрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЧреНрд░рд╛рдл рдЬрд╛рдБрдЪ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рд╕рд░рд▓ рдЧреНрд░рд╛рдл рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдордзреНрдпреЗ рдПрдХрдХреЛ рд░реВрдкрдорд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдордХреЛ рдкрд╛рдареНрдпрдХреНрд░рдордорд╛ рджрд┐рдЗрдиреНрдЫред рдЙрдирдХреЛ рд╡рд┐рдЪрд╛рд░ рд╕реАрдзрд╛ рдЫ: рдкрд╣рд┐рд▓реЗ рд╣рд╛рдореА рдХреБрдиреИ рди рдХреБрдиреИ рд░реВрдкрдорд╛ рдмрд╛рдпрд╛рдБ рд╡рд╛ рджрд╛рдпрд╛рдБ рд╕рд╛рдЭреЗрджрд╛рд░реАрдорд╛ рдард╛рдбреЛ рд░рд╛рдЦреНрдЫреМрдВ, рд░ рдЬрдм рдПрдХ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдХрд┐рдирд╛рд░рд╛ рдлреЗрд▓рд╛ рдкрд░реНрдпреЛ, рд╣рд╛рдореА рдЧреНрд░рд╛рдл рджреНрд╡рд┐рдкрдХреНрд╖реАрдп рдЫреИрди рднрдиреЗрд░ рджрд╛рдмреА рдЧрд░реНрдЫреМрдВред

рдереЛрд░реИ рдердк рд╡рд┐рд╡рд░рдг: рдкрд╣рд┐рд▓реЗ рд╣рд╛рдореАрд▓реЗ рдмрд╛рдпрд╛рдБ рд╕реЗрдпрд░рдорд╛ рдХреЗрд╣реА vertex рд░рд╛рдЦреНрдЫреМрдВред рдЬрд╛рд╣рд┐рд░ рдЫ, рдпрд╕ рд╢реАрд░реНрд╖ рдХреЛ рд╕рдмреИ рдЫрд┐рдореЗрдХреАрд╣рд░реВ рд╕рд╣реА рд▓реЛрдмрдорд╛ рд╕реБрддреНрдиреБ рдкрд░реНрдЫред рдпрд╕рдмрд╛рд╣реЗрдХ, рдпрд╕ рд╢реАрд░реНрд╖рдХреЛ рдЫрд┐рдореЗрдХреАрд╣рд░реВрдХрд╛ рд╕рдмреИ рдЫрд┐рдореЗрдХреАрд╣рд░реВ рдмрд╛рдпрд╛рдБ рд▓реЛрдмрдорд╛ рд╕реБрддреНрдиреБ рдкрд░реНрдЫ, рд░ рдпрд╕реНрддреИред рд╣рд╛рдореАрд▓реЗ рдЫрд┐рдореЗрдХреАрд╣рд░реВрд▓рд╛рдИ рддреЛрдХреЗрдХрд╛ рдЫреИрдиреМрдВ рднрд░реНрдЯреЗрдХреНрд╕рдХреЛ рдЬрдбрд╛рди рдЧрд░рд┐рдПрдХреЛ рдХрдореНрдкреЛрдиреЗрдиреНрдЯрдорд╛ рднреЗрд░реНрдЯрд┐рд╕рд╣рд░реВ рдЕрдЭреИ рдмрд╛рдБрдХреА рд░рд╣реЗрд╕рдореНрдо рд╣рд╛рдореА рдареЗрдЧрд╛рдирд╛рд╣рд░реВрд▓рд╛рдИ рд╕реЗрдпрд░рд╣рд░реВ рддреЛрдХреНрди рдЬрд╛рд░реА рд░рд╛рдЦреНрдЫреМрдВред рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рдпреЛ рдХрд╛рд░реНрдп рд╕рдмреИ рдЬрдбрд╛рди рднрдПрдХрд╛ рдШрдЯрдХрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рджреЛрд╣реЛрд░реНрдпрд╛рдЙрдБрдЫреМрдВред

рдпрджрд┐ рдЙрд╣реА рд╡рд┐рднрд╛рдЬрдирдорд╛ рдкрд░реЗрдХрд╛ рдард╛рдбреЛрд╣рд░реВ рдмреАрдЪрдХреЛ рдХрд┐рдирд╛рд░рд╛ рдЫ рднрдиреЗ, рдЧреНрд░рд╛рдлрдорд╛ рдПрдХ рдЕрдЬреАрдм рдЪрдХреНрд░ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рдЧрд╛рд╣реНрд░реЛ рдЫреИрди, рдЬреБрди рджреНрд╡рд┐рдкрдХреНрд╖реАрдп рдЧреНрд░рд╛рдлрдорд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдкрдорд╛ рдЬреНрдЮрд╛рдд (рд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛) рдЕрд╕рдореНрднрд╡ рдЫред рдЕрдиреНрдпрдерд╛, рд╣рд╛рдореАрд╕рдБрдЧ рд╕рд╣реА рд╡рд┐рднрд╛рдЬрди рдЫ, рдЬрд╕рдХреЛ рдЕрд░реНрде рдЧреНрд░рд╛рдл рджреНрд╡рд┐рдкрдХреНрд╖реАрдп рдЫред

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдпреЛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреНрд░рдпреЛрдЧ рдЧрд░реА рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХреЛ рдЫ рдЪреМрдбрд╛рдИ рдкрд╣рд┐рд▓реЛ рдЦреЛрдЬ рд╡рд╛ рдЧрд╣рд┐рд░рд╛рдИ рдкрд╣рд┐рд▓реЛ рдЦреЛрдЬред рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛рд╣рд░реВрдорд╛, рдЧрд╣рд┐рд░рд╛рдЗ-рдкрд╣рд┐рд▓реЛ рдЦреЛрдЬ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ рдХрд┐рдирднрдиреЗ рдпреЛ рдереЛрд░реИ рд╕рд░рд▓ рдЫ рд░ рдердк рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рд╣рд░реВ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджреИрдиред рдореИрд▓реЗ рдЧрд╣рд┐рд░рд╛рдИ-рдкрд╣рд┐рд▓реЛ рдЦреЛрдЬ рдкрдирд┐ рд░реЛрдЬреЗрдХреЛ рдЫреБ рдХрд┐рдирдХрд┐ рдпреЛ рдЕрдзрд┐рдХ рдкрд░рдореНрдкрд░рд╛рдЧрдд рдЫред

рдпрд╕рд░реА, рд╣рд╛рдореА рдирд┐рдореНрди рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдЖрдПрдХрд╛ рдЫреМрдВред рд╣рд╛рдореА рдЧрд╣рд┐рд░рд╛рдИ-рдкрд╣рд┐рд▓реЛ рдЦреЛрдЬ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЧреНрд░рд╛рдлрдХреЛ рдард╛рдбреЛ рдкрд╛рд░ рдЧрд░реНрдЫреМрдВ рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕реЗрдпрд░рд╣рд░реВ рдЕрд╕рд╛рдЗрди рдЧрд░реНрдЫреМрдВ, рд╣рд╛рдореА рдХрд┐рдирд╛рд░рд╛рд╕рдБрдЧреИ рдЕрдШрд┐ рдмрдвреНрджрд╛ рд╕реЗрдпрд░рдХреЛ рд╕рдВрдЦреНрдпрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдЫреМрдВред рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рд╕реЗрдпрд░ рддреЛрдХрд┐рдПрдХреЛ рднрд░реНрдЯреЗрдХреНрд╕рдорд╛ рд╕реЗрдпрд░ рдЕрд╕рд╛рдЗрди рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдЫреМрдВ рднрдиреЗ, рд╣рд╛рдореА рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдкрдорд╛ рднрдиреНрди рд╕рдХреНрдЫреМрдВ рдХрд┐ рдЧреНрд░рд╛рдл рджреНрд╡рд┐рдкрдХреНрд╖реАрдп рдЫреИрдиред рд╕рдмреИ рдард╛рдбреЛрд╣рд░реВрд▓рд╛рдИ рд╕рд╛рдЭрд╛ рддреЛрдХрд┐рдПрдХреЛ рдХреНрд╖рдг рд░ рд╣рд╛рдореАрд▓реЗ рд╕рдмреИ рдХрд┐рдирд╛рд░рд╣рд░реВ рд╣реЗрд░реЗрдХрд╛ рдЫреМрдВ, рд╣рд╛рдореАрд╕рдБрдЧ рд░рд╛рдореНрд░реЛ рд╡рд┐рднрд╛рдЬрди рдЫред

рдЧрдгрдирд╛ рдХреЛ рд╢реБрджреНрдзрддрд╛

рд╣рд╛рд╕реНрдХреЗрд▓рдорд╛ рд╣рд╛рдореА рдорд╛рдиреНрджрдЫреМрдВ рдХрд┐ рд╕рдмреИ рдЧрдгрдирд╛рд╣рд░реВ рдЫрдиреН рд╕рдлрд╛ред рдпрджреНрдпрдкрд┐, рдпрджрд┐ рдпреЛ рд╕рд╛рдБрдЪреНрдЪреИ рдорд╛рдорд▓рд╛ рд╣реЛ рднрдиреЗ, рд╣рд╛рдореАрд╕рдБрдЧ рд╕реНрдХреНрд░рд┐рдирдорд╛ рдХреЗрд╣рд┐ рдЫрд╛рдкреНрдиреЗ рдХреБрдиреИ рддрд░рд┐рдХрд╛ рд╣реБрдиреЗрдЫреИрдиред рдмрд┐рд▓реНрдХреБрд▓реИ, рд╕рдлрд╛ рдЧрдгрдирд╛ рдпрддрд┐ рдЕрд▓реНрдЫреА рдЫ рдХрд┐ рддреНрдпрд╣рд╛рдБ рдПрдХ рдЫреИрди рд╕рдлрд╛ рдХреЗрд╣рд┐ рдЧрдгрдирд╛ рдЧрд░реНрди рдХрд╛рд░рдгрд╣рд░реВред рдХрд╛рд░реНрдпрдХреНрд░рдордорд╛ рд╣реБрдиреЗ рд╕рдмреИ рдЧрдгрдирд╛рд╣рд░реВ рдХреБрдиреИ рди рдХреБрдиреИ рд░реВрдкрдорд╛ рдмрд╛рдзреНрдп рдЫрдиреН "рдЕрд╢реБрджреНрдз" рдореЛрдирд╛рдб IOред

рдореЛрдирд╛рдбрд╣рд░реВ рдЧрдгрдирд╛рдХреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрдиреЗ рддрд░рд┐рдХрд╛ рд╣реЛ рдкреНрд░рднрд╛рд╡рд╣рд░реВ Haskell рдорд╛ред рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫрдиреН рднрдиреНрдиреЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдпрд╕ рдкреЛрд╕реНрдЯрдХреЛ рджрд╛рдпрд░рд╛рднрдиреНрджрд╛ рдмрд╛рд╣рд┐рд░ рдЫред рдЕрдВрдЧреНрд░реЗрдЬреАрдорд╛ рд░рд╛рдореНрд░реЛ рд░ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╡рд░рдг рдкрдвреНрди рд╕рдХрд┐рдиреНрдЫ рдпрд╣рд╛рдБ.

рдпрд╣рд╛рдБ рдо рдпреЛ рдХреБрд░рд╛ рдФрдВрд▓реНрдпрд╛рдЙрди рдЪрд╛рд╣рдиреНрдЫреБ рдХрд┐ IO рдЬрд╕реНрддрд╛ рдХреЗрд╣реА рдореЛрдирд╛рдбрд╣рд░реВ рдХрдореНрдкрд╛рдЗрд▓рд░ рдореНрдпрд╛рдЬрд┐рдХ рдорд╛рд░реНрдлрдд рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреН, рд▓рдЧрднрдЧ рд╕рдмреИ рдЕрд░реВрд╣рд░реВ рд╕рдлреНрдЯрд╡реЗрдпрд░рдорд╛ рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреН рд░ рддрд┐рдиреАрд╣рд░реВрдорд╛ рднрдПрдХрд╛ рд╕рдмреИ рдЧрдгрдирд╛рд╣рд░реВ рд╢реБрджреНрдз рдЫрдиреНред

рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рдкреНрд░рднрд╛рд╡рд╣рд░реВ рдЫрдиреН рд░ рдкреНрд░рддреНрдпреЗрдХрдХреЛ рдЖрдлреНрдиреИ рдореЛрдирд╛рдб рдЫред рдпреЛ рдПрдХ рдзреЗрд░реИ рдмрд▓рд┐рдпреЛ рд░ рд╕реБрдиреНрджрд░ рд╕рд┐рджреНрдзрд╛рдиреНрдд рд╣реЛ: рд╕рдмреИ рдореЛрдирд╛рдбрд╣рд░реВрд▓реЗ рдПрдЙрдЯреИ рдЗрдиреНрдЯрд░рдлреЗрд╕ рд▓рд╛рдЧреВ рдЧрд░реНрджрдЫред рд╣рд╛рдореА рдирд┐рдореНрди рддреАрди рдореЛрдирд╛рдбрд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреМрдВ:

  • рдпрд╛ рдд ea рдПрдЙрдЯрд╛ рдЧрдгрдирд╛ рд╣реЛ рдЬрд╕рд▓реЗ рдкреНрд░рдХрд╛рд░ a рдХреЛ рдорд╛рди рдлрд░реНрдХрд╛рдЙрдБрдЫ рд╡рд╛ рдкреНрд░рдХрд╛рд░ e рдХреЛ рдЕрдкрд╡рд╛рдж рдлреНрдпрд╛рдБрдХреНрдЫред рдпрд╕ рдореЛрдирд╛рдбрдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛рд╣рд░реВрдорд╛ рдЕрдкрд╡рд╛рдж рд╣реНрдпрд╛рдиреНрдбрд▓рд┐рдЩрд╕рдБрдЧ рдорд┐рд▓реНрджреЛрдЬреБрд▓реНрджреЛ рдЫ: рддреНрд░реБрдЯрд┐рд╣рд░реВ рд╕рдорд╛рддреНрди рд╡рд╛ рдкрд╛рд╕ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдореБрдЦреНрдп рднрд┐рдиреНрдирддрд╛ рдпреЛ рд╣реЛ рдХрд┐ рдореЛрдирд╛рдб рдкреВрд░реНрдгрддрдпрд╛ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдкрдорд╛ рд╣рд╛рд╕реНрдХреЗрд▓рдХреЛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпрдорд╛ рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХреЛ рдЫ, рдЬрдмрдХрд┐ рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛рд╣рд░реВрд▓реЗ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрдпрдиреНрддреНрд░рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫрдиреНред
  • рд╕реНрдЯреЗрдЯ sa рдПрдХ рдЧрдгрдирд╛ рд╣реЛ рдЬрд╕рд▓реЗ рдкреНрд░рдХрд╛рд░ a рдХреЛ рдорд╛рди рдлрд░реНрдХрд╛рдЙрдБрдЫ рд░ рдкреНрд░рдХрд╛рд░ s рдХреЛ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕реНрдерд┐рддрд┐рдорд╛ рдкрд╣реБрдБрдЪ рдЫред
  • рд╕рд╛рдпрдж рдП. рд╕рд╛рдпрдж рдореЛрдирд╛рдбрд▓реЗ рдХреБрдиреИ рдкрдирд┐ рд╕рдордпрдорд╛ рдХреЗрд╣рд┐ рдкрдирд┐ рдлрд░реНрдХрд╛рдПрд░ рдЕрд╡рд░реЛрдз рдЧрд░реНрди рд╕рдХреНрдиреЗ рдЧрдгрдирд╛ рд╡реНрдпрдХреНрдд рдЧрд░реНрджрдЫред рдпрджреНрдпрдкрд┐, рд╣рд╛рдореА рд╢рд╛рдпрдж рдкреНрд░рдХрд╛рд░рдХреЛ рд▓рд╛рдЧрд┐ рдореЛрдирд╛рдбрдкреНрд▓рд╕ рд╡рд░реНрдЧрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреМрдВ, рдЬрд╕рд▓реЗ рд╡рд┐рдкрд░рд┐рдд рдкреНрд░рднрд╛рд╡рд▓рд╛рдИ рд╡реНрдпрдХреНрдд рдЧрд░реНрджрдЫ: рдпреЛ рдПрдХ рдЧрдгрдирд╛ рд╣реЛ рдЬреБрди рдХреБрдиреИ рдкрдирд┐ рд╕рдордпрдорд╛ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рди рдлрд░реНрдХрд╛рдПрд░ рдЕрд╡рд░реЛрдз рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рд╣рд╛рдореАрд╕рдБрдЧ рджреБрдИрд╡рдЯрд╛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░рд╣рд░реВ рдЫрдиреН, рдЧреНрд░рд╛рдл рдП рд░ рдмрд┐рдЧреНрд░рд╛рдл 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)

рдпреЛ рд╣реЗрд░реНрди рд╕рдЬрд┐рд▓реЛ рдЫ рдХрд┐ рдпрджрд┐ рдЧрд╣рд┐рд░рд╛рдИ-рдкрд╣рд┐рд▓реЛ рдЦреЛрдЬрдХреЛ рдХреНрд░рдордорд╛ рд╣рд╛рдореАрд▓реЗ рдПрдХ рд╡рд┐рд╡рд╛рджрд┐рдд рдХрд┐рдирд╛рд░рд╛ рдлреЗрд▓рд╛ рдкрд╛рд░реНрдпреМрдВ рднрдиреЗ, рд╡рд┐рдЪрд┐рддреНрд░ рдЪрдХреНрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реНрдЯреНрдпрд╛рдХрдХреЛ рд╢реАрд░реНрд╖рдорд╛ рдЫред рдпрд╕реИрд▓реЗ, рдпрд╕рд▓рд╛рдИ рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди, рд╣рд╛рдореАрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реНрдЯреНрдпрд╛рдХрдмрд╛рдЯ рдЕрдиреНрддрд┐рдо рднреЗрд░реНрдЯреЗрдХреНрд╕рдХреЛ рдкрд╣рд┐рд▓реЛ рдШрдЯрдирд╛ рд╕рдореНрдо рд╕рдмреИ рдЪреАрдЬрд╣рд░реВ рдХрд╛рдЯреНрдиреБ рдкрд░реНрдЫред

рд╣рд╛рдореА рдкреНрд░рддреНрдпреЗрдХ vertex рдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╛рдЭрд╛ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдПрдХ рд╕рд╣рдпреЛрдЧреА рд╕рд░рдгреА рдХрд╛рдпрдо рдЧрд░реЗрд░ рдЧрд╣рд┐рд░рд╛рдИ-рдкрд╣рд┐рд▓реЛ рдЦреЛрдЬ рд▓рд╛рдЧреВ рдЧрд░реНрдЫреМрдВред рд╣рд╛рдореАрд▓реЗ рд░реЛрдЬреЗрдХреЛ рдореЛрдирд╛рдбрдХреЛ рдлрдВрдХреНрдЯрд░ рдХреНрд▓рд╛рд╕рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд╛рд░реНрдлрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реНрдЯреНрдпрд╛рдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдХрд╛рдпрдо рд╣реБрдиреЗрдЫ: рд╣рд╛рдореАрд▓реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рдХрд╛рд░реНрдпрдмрд╛рдЯ рдлрд┐рд░реНрддрд╛ рдЖрдПрдХреЛ рдирддрд┐рдЬрд╛рдорд╛ рдкрдердмрд╛рдЯ рд╕рдмреИ рд╢реАрд░реНрд╖рд╣рд░реВ рдорд╛рддреНрд░ рд░рд╛рдЦреНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреЗрдЫред

рдореЗрд░реЛ рдкрд╣рд┐рд▓реЛ рд╡рд┐рдЪрд╛рд░ Either monad рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рдерд┐рдпреЛ, рдЬрд╕рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдЪрд╛рд╣рд┐рдиреЗ рдкреНрд░рднрд╛рд╡рд╣рд░реВ рд▓рд╛рдЧреВ рдЧрд░реНрджрдЫред рдореИрд▓реЗ рд▓реЗрдЦреЗрдХреЛ рдкрд╣рд┐рд▓реЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпреЛ рд╡рд┐рдХрд▓реНрдкрдХреЛ рдзреЗрд░реИ рдирдЬрд┐рдХ рдерд┐рдпреЛред рд╡рд╛рд╕реНрддрд╡рдорд╛, рдорд╕рдБрдЧ рдПрдХ рдмрд┐рдиреНрджреБрдорд╛ рдкрд╛рдБрдЪрд╡рдЯрд╛ рдлрд░рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирд╣рд░реВ рдерд┐рдП рд░ рдЕрдиреНрддрддрдГ рдЕрд░реНрдХреЛрдорд╛ рдмрд╕реЗред

рдкрд╣рд┐рд▓реЗ, рд╣рд╛рдореАрд▓реЗ рд╕рд╛рдЭрд╛ рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд╕рд╣рдпреЛрдЧреА рдПрд░реЗ рдХрд╛рдпрдо рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ - рдпреЛ рд░рд╛рдЬреНрдпрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреЗрд╣рд┐ рд╣реЛред рджреЛрд╕реНрд░реЛ, рджреНрд╡рдиреНрджреНрд╡ рдкрддреНрддрд╛ рд▓рд╛рдЧреНрджрд╛ рд╣рд╛рдореАрд▓реЗ рд░реЛрдХреНрди рд╕рдХреНрд╖рдо рд╣реБрдиреБрдкрд░реНрджрдЫред рдпреЛ рдпрд╛ рдд рдХреЛ рд▓рд╛рдЧрд┐ Monad, рд╡рд╛ MonadPlus рд╣реБрди рд╕рдХреНрдЫред рдореБрдЦреНрдп рднрд┐рдиреНрдирддрд╛ рдпреЛ рд╣реЛ рдХрд┐ рдпрд╛ рдд рдорд╛рди рдлрд┐рд░реНрддрд╛ рдЧрд░реНрди рд╕рдХреНрдЫ рдпрджрд┐ рдЧрдгрдирд╛ рд░реЛрдХрд┐рдПрдХреЛ рдЫреИрди, рд░ рд╣реБрдирд╕рдХреНрдЫ рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдпрд╕ рдмрд╛рд░реЗ рдЬрд╛рдирдХрд╛рд░реА рдорд╛рддреНрд░ рдлрд░реНрдХрд╛рдЙрдБрдЫред рд╣рд╛рдореАрд▓рд╛рдИ рд╕рдлрд▓рддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЫреБрдЯреНрдЯреИ рдореВрд▓реНрдпрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░реНрджреИрди (рдпреЛ рд░рд╛рдЬреНрдпрдорд╛ рдкрд╣рд┐рд▓реЗ рдиреИ рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдПрдХреЛ рдЫ), рд╣рд╛рдореА рд╕рд╛рдпрдж рдЫрдиреМрдЯ рдЧрд░реНрдЫреМрдВред рд░ рдпрд╕ рдХреНрд╖рдгрдорд╛ рдЬрдм рд╣рд╛рдореАрд▓реЗ рджреБрдИ рдореЛрдирд╛рдбрд╣рд░реВрдХреЛ рдкреНрд░рднрд╛рд╡рд╣рд░реВ рд╕рдВрдпреЛрдЬрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рддрд┐рдиреАрд╣рд░реВ рдмрд╛рд╣рд┐рд░ рдЖрдЙрдБрдЫрдиреН рдореЛрдирд╛рдб рдЯреНрд░рд╛рдиреНрд╕рдлрд░реНрдорд░, рдЬрд╕рд▓реЗ рдпреА рдкреНрд░рднрд╛рд╡рд╣рд░реВрд▓рд╛рдИ рдареАрдХрд╕рдБрдЧ рдЬреЛрдбреНрджрдЫред

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

рдпрд╕рд░реА рд╣рд╛рдореА рдпреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдЫреМрдВред

{-# 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 рд▓реЗ рдорд╛рди рдлрд░реНрдХрд╛рдЙрдБрдЫ рднрдиреЗ, рд╣рд╛рдореА vertex v рддреНрдпрд╣рд╛рдБ рдкреБрд╢ рдЧрд░реНрдЫреМрдВред
  • onEdge рддреНрдпреЛ рднрд╛рдЧ рд╣реЛ рдЬрд╣рд╛рдБ рд╣рд╛рдореА рдХрд┐рдирд╛рд░рд╛рдорд╛ рдЬрд╛рдиреНрдЫреМрдВред рдпрд╕рд▓рд╛рдИ рдкреНрд░рддреНрдпреЗрдХ рдХрд┐рдирд╛рд░рд╛рдХреЛ рд▓рд╛рдЧрд┐ рджреБрдИ рдкрдЯрдХ рднрдирд┐рдиреНрдЫред рдпрд╣рд╛рдБ рд╣рд╛рдореА рдЬрд╛рдБрдЪ рдЧрд░реНрдЫреМрдВ рдХрд┐ рдЕрд░реНрдХреЛ рдЫреЗрдЙрдХреЛ рднреЗрд░реНрдЯреЗрдХреНрд╕ рднреНрд░рдордг рдЧрд░рд┐рдПрдХреЛ рдЫ, рд░ рдпрджрд┐ рдЫреИрди рднрдиреЗ рдпрд╕рд▓рд╛рдИ рднреНрд░рдордг рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдпрджрд┐ рднреНрд░рдордг рдЧрд░рд┐рдПрдХреЛ рдЫ рднрдиреЗ, рд╣рд╛рдореА рдХрд┐рдирд╛рд░рд╛ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рдЫ рдХрд┐ рдЫреИрди рдЬрд╛рдБрдЪ рдЧрд░реНрдЫреМрдВред рдпрджрд┐ рдпреЛ рд╣реЛ рднрдиреЗ, рд╣рд╛рдореА рдорд╛рди рдлрд┐рд░реНрддрд╛ рдЧрд░реНрдЫреМрдВ - рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реНрдЯреНрдпрд╛рдХрдХреЛ рдПрдХрджрдо рд╢реАрд░реНрд╖, рдЬрд╣рд╛рдБ рдЕрдиреНрдп рд╕рдмреИ рдард╛рдбреЛрд╣рд░реВ рдлрд┐рд░реНрддрд╛рдорд╛ рд░рд╛рдЦрд┐рдиреЗрдЫред
  • processVertex рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рднреЗрд░реНрдЯреЗрдХреНрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдЬрд╛рдБрдЪ рдЧрд░реНрджрдЫ рдХрд┐ рдпреЛ рднреНрд░рдордг рдЧрд░рд┐рдПрдХреЛ рдЫ рд░ рдпрджрд┐ рдЫреИрди рднрдиреЗ рдпрд╕рдорд╛ рднрд░реНрдЯреЗрдХреНрд╕ рдЪрд▓реНрдЫред
  • dfs рд╕рдмреИ рдард╛рдбреЛрд╣рд░реВрдорд╛ processVertex рдЪрд▓рд╛рдЙрдБрдЫред

рдпрддрд┐ рдиреИред

рдЗрдирд▓рд╛рдЗрди рд╢рдмреНрджрдХреЛ рдЗрддрд┐рд╣рд╛рд╕

INLINE рд╢рдмреНрдж рдПрд▓реНрдЧреЛрд░рд┐рдереНрдордХреЛ рдкрд╣рд┐рд▓реЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдорд╛ рдерд┐рдПрди; рдпреЛ рдкрдЫрд┐ рджреЗрдЦрд╛ рдкрд░реНтАНрдпреЛред рдЬрдм рдореИрд▓реЗ рд░рд╛рдореНрд░реЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЦреЛрдЬреНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реЗрдВ, рдореИрд▓реЗ рдлреЗрд▓рд╛ рдкрд╛рд░реЗ рдХрд┐ рдЧреИрд░-рдЗрдирд▓рд╛рдЗрди рд╕рдВрд╕реНрдХрд░рдг рдХреЗрд╣реА рдЧреНрд░рд╛рдлрд╣рд░реВрдорд╛ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд░реВрдкрдорд╛ рдврд┐рд▓реЛ рдерд┐рдпреЛред рд╕рд┐рдореЗрдиреНрдЯрд┐рдХ рд░реВрдкрдорд╛ рдХрд╛рд░реНрдпрд╣рд░реВрд▓реЗ рд╕рдорд╛рди рдХрд╛рдо рдЧрд░реНрдиреБрдкрд░реНрдЫ рднрдиреНрдиреЗ рдХреБрд░рд╛рд▓рд╛рдИ рдзреНрдпрд╛рдирдорд╛ рд░рд╛рдЦреНрджреИ, рдпрд╕рд▓реЗ рдорд▓рд╛рдИ рдзреЗрд░реИ рдЫрдХреНрдХ рдкрд╛рд░реНрдпреЛред рдЕрдкрд░рд┐рдЪрд┐рдд рдкрдирд┐, GHC рдХреЛ рдлрд░рдХ рд╕рдВрд╕реНрдХрд░рдгрдХреЛ рд╕рд╛рде рдЕрд░реНрдХреЛ рдореЗрд╕рд┐рдирдорд╛ рдХреБрдиреИ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рднрд┐рдиреНрдирддрд╛ рдерд┐рдПрдиред

GHC рдХреЛрд░ рдЖрдЙрдЯрдкреБрдЯ рдкрдвреЗрд░ рдПрдХ рд╣рдкреНрддрд╛ рдмрд┐рддрд╛рдПрдкрдЫрд┐, рдореИрд▓реЗ рд╕реНрдкрд╖реНрдЯ INLINE рдХреЛ рдПрдХ рд▓рд╛рдЗрдирдХреЛ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рд╕рдХреНрд╖рдо рднрдПрдБред GHC 8.4.4 рд░ GHC 8.6.5 рдХреЛ рдмреАрдЪрдорд╛ рдХреЗрд╣рд┐ рдмрд┐рдиреНрджреБрдорд╛ рдЕрдиреБрдХреВрд▓рдХрд▓реЗ рдпреЛ рдЖрдлреИрдВ рдЧрд░реНрди рдмрдиреНрдж рдЧрд░реНрдпреЛред

рдореИрд▓реЗ рд╣рд╕реНрдХреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩрдорд╛ рдпрд╕реНрддреЛ рдлреЛрд╣реЛрд░рдХреЛ рд╕рд╛рдордирд╛ рдЧрд░реНрдиреЗ рдЖрд╢рд╛ рдЧрд░реЗрдиред рдпрджреНрдпрдкрд┐, рдЖрдЬ рдкрдирд┐, рдЕрдкреНрдЯрд┐рдорд╛рдЗрдЬрд░рд╣рд░реВрд▓реЗ рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдВ рдЧрд▓реНрддреА рдЧрд░реНрдЫрдиреН, рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕рдВрдХреЗрдд рджрд┐рдиреБ рд╣рд╛рдореНрд░реЛ рдХрд╛рдо рд╣реЛред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпрд╣рд╛рдБ рд╣рд╛рдореАрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ рдХрд┐ рдкреНрд░рдХрд╛рд░реНрдп рдЗрдирд▓рд╛рдЗрди рд╣реБрдиреБрдкрд░реНрдЫ рдХрд┐рдирднрдиреЗ рдпреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕рдВрд╕реНрдХрд░рдгрдорд╛ рдЗрдирд▓рд╛рдЗрди рдЧрд░рд┐рдПрдХреЛ рдЫ, рд░ рдпреЛ рдХрдореНрдкрд╛рдЗрд▓рд░рд▓рд╛рдИ рд╕рдВрдХреЗрдд рджрд┐рдиреЗ рдХрд╛рд░рдг рд╣реЛред

рдЕрдирд┐ рдХреЗ рднрдпреЛ?

рддреНрдпрд╕рдкрдЫрд┐ рдореИрд▓реЗ рдЕрдиреНрдп рдореЛрдирд╛рдбрд╣рд░реВрд╕рдБрдЧ Hopcroft-Karp рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд╛рдЧреВ рдЧрд░реЗрдВ, рд░ рддреНрдпреЛ рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рдЕрдиреНрддреНрдп рдерд┐рдпреЛред

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

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди