GSoC 2019: เบเบณเบฅเบฑเบ‡เบเบงเบ”เบชเบญเบšเบเบฒเบฃเบฒเบŸเบชเบณเบฅเบฑเบšเบ•เบปเบงเบ›เปˆเบฝเบ™เปเบšเบš bipartiteness เปเบฅเบฐ monad

เบฅเบฐเบ”เบนเบฎเป‰เบญเบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบก เบฅเบฐเบซเบฑเบ”เบฅเบฐเบ”เบนเบฎเป‰เบญเบ™เบ‚เบญเบ‡ Google - เป‚เบ„เบ‡เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเบฎเบฝเบ™เบˆเบฒเบ Google. เบ—เบธเบเป†เบ›เบต, เบœเบนเป‰เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เป„เบ”เป‰เป€เบฅเบทเบญเบเป‚เบ„เบ‡เบเบฒเบ™ Open Source เบซเบผเบฒเบ, เบฅเบงเบกเบ—เบฑเบ‡เบˆเบฒเบเบญเบปเบ‡เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ—เบตเปˆเบกเบตเบŠเบทเปˆเบชเบฝเบ‡เป€เบŠเบฑเปˆเบ™ Boost.org ะธ เบกเบนเบ™เบ™เบดเบ—เบด Linux. Google เป€เบŠเบตเบ™เบ™เบฑเบเบฎเบฝเบ™เบˆเบฒเบเบ—เบปเปˆเบงเป‚เบฅเบเปƒเบซเป‰เป€เบฎเบฑเบ”เบงเบฝเบเบเปˆเบฝเบงเบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰. 

เปƒเบ™เบ–เบฒเบ™เบฐเป€เบ›เบฑเบ™เบœเบนเป‰เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเปƒเบ™ Google Summer of Code 2019, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบฎเบฑเบ”เป‚เบ„เบ‡เบเบฒเบ™เบžเบฒเบเปƒเบ™เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” เป€เบ‡เบดเบ™เป€เบ”เบทเบญเบ™ เบเบฑเบšเบญเบปเบ‡เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡ Haskell.org, เป€เบŠเบดเปˆเบ‡เบเปเบฒเบฅเบฑเบ‡เบžเบฑเบ”เบ—เบฐเบ™เบฒเบžเบฒเบชเบฒ Haskell - เบซเบ™เบถเปˆเบ‡เปƒเบ™เบžเบฒเบชเบฒเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบผเปเบเบผเบกเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบ—เบตเปˆเบชเบธเบ”. Alga เปเบกเปˆเบ™เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ—เบตเปˆเป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™ เบžเบดเบกเบ›เบญเบ”เป„เบž เบเบฒเบ™เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡เบเบฒเบŸเปƒเบ™ Haskell. เบกเบฑเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เปƒเบ™ เบ„เบงเบฒเบกเบฒเบ โ€” เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ” Github เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ•เบปเป‰เบ™เป„เบกเป‰เปเบšเบš semantic, เบเบฃเบฒเบŸเบเบฒเบ™เป€เบญเบตเป‰เบ™ เปเบฅเบฐเบเบฒเบ™เป€เบžเบดเปˆเบ‡เบžเบฒเบญเบฒเป„เบชเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบฅเบฐเบซเบฑเบ” เปเบฅเบฐเบชเบฒเบกเบฒเบ”เบ›เบฝเบšเบ—เบฝเบšเบžเบงเบเบกเบฑเบ™เป„เบ”เป‰. เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹เบ‚เบญเบ‡โ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เปเบกเปˆเบ™โ€‹เบเบฒเบ™โ€‹เป€เบžเบตเปˆเบกโ€‹เบ•เบปเบงโ€‹เปเบ—เบ™โ€‹เบ›เบฐโ€‹เป€เบžเบ”โ€‹เบ—เบตเปˆโ€‹เบ›เบญเบ”โ€‹เป„เบžโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒโ€‹เบŸ bipartite เปเบฅเบฐโ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ•เบปเบงโ€‹เปเบ—เบ™โ€‹เบ™เบฑเป‰เบ™โ€‹. 

เปƒเบ™เบšเบปเบ”เบ‚เบฝเบ™เบ™เบตเป‰, เบ‚เป‰เบญเบเบˆเบฐเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ” algorithm เบ‚เบญเบ‡เบ‚เป‰เบญเบเปƒเบ™เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบเบฒเบŸเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบญเบ‡เบชเปˆเบงเบ™เปƒเบ™ Haskell. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒ algorithm เปเบกเปˆเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบ—เบตเปˆเบชเบธเบ”, เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบกเบฑเบ™เบ—เบตเปˆเบชเบงเบเบ‡เบฒเบกเปƒเบ™เบฎเบนเบšเปเบšเบšเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เป„เบ”เป‰เปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบผเบฒเบเบ„เบฑเป‰เบ‡เปเบฅเบฐเบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบซเบผเบฒเบ. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบปเบเบฅเบปเบ‡เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฑเบš monad transformers. 

GSoC 2019: เบเบณเบฅเบฑเบ‡เบเบงเบ”เบชเบญเบšเบเบฒเบฃเบฒเบŸเบชเบณเบฅเบฑเบšเบ•เบปเบงเบ›เปˆเบฝเบ™เปเบšเบš bipartiteness เปเบฅเบฐ monad

เบเปˆเบฝเบงเบเบฑเบšเบ•เบปเบงเป€เบฎเบปเบฒเป€เบญเบ‡

เบ‚เป‰เบญเบเบŠเบทเปˆ Vasily Alferov, เบ‚เป‰เบญเบเป€เบ›เบฑเบ™เบ™เบฑเบเบชเบถเบเบชเบฒเบ›เบตเบ—เบต 4 เบ—เบตเปˆ St. Petersburg HSE. เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰เปƒเบ™ blog เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ‚เบฝเบ™ เบเปˆเบฝเบงเบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเบเปˆเบฝเบงเบเบฑเบš algorithms parameterized ะธ เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เป€เบ”เบตเบ™เบ—เบฒเบ‡เป„เบ› ZuriHac. เบ”เบฝเบงเบ™เบตเป‰เบ‚เป‰เบญเบ เบเบณ เบฅเบฑเบ‡เบเบถเบเบ‡เบฒเบ™เบขเบนเปˆ เบกเบฐเบซเบฒเบงเบดเบ—เบฐเบเบฒเป„เบฅ Bergen เปƒเบ™เบ›เบฐเป€เบ—เบ”เบ™เปเป€เบง, เบšเปˆเบญเบ™เบ—เบตเปˆเบ‚เป‰เบญเบเบเปเบฒเบฅเบฑเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒ เบฅเบฒเบเบŠเบทเปˆเบชเบต. เบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบ‚เบญเบ‡เบ‚เป‰เบญเบเบ›เบฐเบเบญเบšเบกเบตเบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เปเบฅเบฐเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบผเปเบเบผเบกเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”.

เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ” algorithm

เบ„เปเบฒเบญเบฐเบ—เบดเบ–เบฒเบ™

เบ™เบฑเบเบชเบถเบเบชเบฒเบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเป‚เบ„เบ‡เบเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบŠเบธเบเบเบนเป‰เบขเปˆเบฒเบ‡เปเบ‚เบ‡เปเบฎเบ‡เปƒเบ™ blog. เบžเบงเบเป€เบ‚เบปเบฒเป„เบ”เป‰เปƒเบซเป‰เบ‚เป‰เบญเบเบกเบตเป€เบงเบ—เบตเบชเปเบฒเบฅเบฑเบš blog เบฅเบฐเบ”เบนเบฎเป‰เบญเบ™เบ‚เบญเบ‡ Haskell. เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เป€เบ›เบฑเบ™เบเบฒเบ™เปเบ› เบšเบปเบ”เบ„เบงเบฒเบก, เบ‚เบฝเบ™เป‚เบ”เบเบ‚เป‰เบญเบเบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™เปƒเบ™เป€เบ”เบทเบญเบ™เบเปเบฅเบฐเบเบปเบ”เปƒเบ™เบžเบฒเบชเบฒเบญเบฑเบ‡เบเบดเบ”, เบกเบตเบ„เปเบฒเบ™เปเบฒเบชเบฑเป‰เบ™เป†. 

เบ”เบถเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ—เบตเปˆเบกเบตเบฅเบฐเบซเบฑเบ”เปƒเบ™เบ„เปเบฒเบ–เบฒเบกเบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰ เบ—เบตเปˆเบ™เบตเป‰.

เป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบœเบปเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบ‚เป‰เบญเบ (เป€เบ›เบฑเบ™เบžเบฒเบชเบฒเบญเบฑเบ‡เบเบดเบ”) เบ—เบตเปˆเบ™เบตเป‰.

เบ•เบญเบšเบ™เบตเป‰เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบœเบนเป‰เบญเปˆเบฒเบ™เบกเบตเบ„เบงเบฒเบกเบ„เบธเป‰เบ™เป€เบ„เบตเบเบเบฑเบšเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบžเบทเป‰เบ™เบ–เบฒเบ™เปƒเบ™เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเบ—เบตเปˆเบกเบตเบ›เบฐเป‚เบซเบเบ”, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบ‚เป‰เบญเบเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเบˆเบทเปˆเบˆเปเบฒเบ„เปเบฒเบชเบฑเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเปƒเบŠเป‰เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบงเบฅเบฒเบกเบฒ.

เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบเบฒเบŸเบชเปเบฒเบฅเบฑเบš bipartiteness 

เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบเบฒเบŸเบชเปเบฒเบฅเบฑเบš bipartiteness เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเปเบกเปˆเบ™เป„เบ”เป‰เบ–เบทเบเบกเบญเบšเปƒเบซเป‰เบขเบนเปˆเปƒเบ™เบซเบผเบฑเบเบชเบนเบ”เบเปˆเบฝเบงเบเบฑเบšเบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเป€เบ›เบฑเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบเบฒเบŸเบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบ—เบตเปˆเบชเบธเบ”. เบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡เบฅเบฒเบงเปเบกเปˆเบ™เบเบปเบ‡เป„เบ›เบเบปเบ‡เบกเบฒ: เบ—เปเบฒเบญเบดเบ”เบžเบงเบเป€เบฎเบปเบฒเบงเบฒเบ‡เปเบ™เบงเบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™เบชเปˆเบงเบ™เปเบšเปˆเบ‡เบŠเป‰เบฒเบเบซเบผเบทเบ‚เบงเบฒ, เปเบฅเบฐเป€เบกเบทเปˆเบญเบžเบปเบšเบ‚เบญเบšเบ—เบตเปˆเบ‚เบฑเบ”เปเบเป‰เบ‡, เบžเบงเบเป€เบฎเบปเบฒเบขเบทเบ™เบขเบฑเบ™เบงเปˆเบฒเป€เบชเบฑเป‰เบ™เบชเบฐเปเบ”เบ‡เบšเปเปˆเปเบกเปˆเบ™เบชเบญเบ‡เบชเปˆเบงเบ™.

เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเป€เบฅเบฑเบเบ™เป‰เบญเบ: เบ—เปเบฒเบญเบดเบ”เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบปเบฒเบšเบฒเบ‡เบˆเบธเบ”เบขเบนเปˆเปƒเบ™เบชเปˆเบงเบ™เปเบšเปˆเบ‡เบŠเป‰เบฒเบ. เปเบ™เปˆเบ™เบญเบ™, เบ›เบฐเป€เบ—เบ”เป€เบžเบทเปˆเบญเบ™เบšเป‰เบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡ vertex เบ™เบตเป‰เบ•เป‰เบญเบ‡เบ™เบญเบ™เบขเบนเปˆเปƒเบ™ lobe เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ›เบฐเป€เบ—เบ”เป€เบžเบทเปˆเบญเบ™เบšเป‰เบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบ›เบฐเป€เบ—เบ”เป€เบžเบทเปˆเบญเบ™เบšเป‰เบฒเบ™เบ‚เบญเบ‡ vertex เบ™เบตเป‰เบ•เป‰เบญเบ‡เบ™เบญเบ™เบขเบนเปˆเปƒเบ™ lobe เบŠเป‰เบฒเบ, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบžเบงเบเป€เบฎเบปเบฒเบชเบทเบšเบ•เปเปˆเบเบฒเบ™เบกเบญเบšเปเบฒเบเบฎเบธเป‰เบ™เปƒเบซเป‰เบเบฑเบšเปเบ™เบงเบ•เบฑเป‰เบ‡เบ•เบฒเบšเปƒเบ”เบ—เบตเปˆเบเบฑเบ‡เบกเบตเบˆเบธเบ”เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบ™เบ‚เบญเบ‡ vertex เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เบกเบญเบšเปเบฒเบเปƒเบซเป‰เป€เบžเบทเปˆเบญเบ™เบšเป‰เบฒเบ™. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเป€เบฎเบฑเบ”เบŠเป‰เปเบฒเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ™เบตเป‰เบชเปเบฒเบฅเบฑเบšเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”.

เบ–เป‰เบฒเบกเบตเบ‚เบญเบšเบฅเบฐเบซเบงเปˆเบฒเบ‡เบˆเบธเบ”เบ—เบตเปˆเบ•เบปเบเบขเบนเปˆเปƒเบ™เบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เบ”เบฝเบงเบเบฑเบ™, เบกเบฑเบ™เบšเปเปˆเบเบฒเบเบ—เบตเปˆเบˆเบฐเบŠเบญเบเบซเบฒเบงเบปเบ‡เบˆเบญเบ™เบ„เบตเบเปƒเบ™เบเบฒเบŸ, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเบเบฑเบ™เบขเปˆเบฒเบ‡เบเบงเป‰เบฒเบ‡เบ‚เบงเบฒเบ‡ (เปเบฅเบฐเปเบ™เปˆเบ™เบญเบ™) เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เปƒเบ™เบเบฒเบŸ bipartite. เบ–เป‰เบฒเบšเปเปˆเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡, เบŠเบถเปˆเบ‡เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเป€เบชเบฑเป‰เบ™เบชเบฐเปเบ”เบ‡เปเบกเปˆเบ™ bipartite.

เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบด, เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ™เบตเป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ”เบเปƒเบŠเป‰ เบ„เบงเบฒเบกเบเบงเป‰เบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ” เบซเบผเบท เบ„เบงเบฒเบกโ€‹เป€เบฅเบดเบโ€‹เบเบฒเบ™โ€‹เบ„เบปเป‰เบ™โ€‹เบซเบฒโ€‹เบ„เบฑเป‰เบ‡โ€‹เบ—เปเบฒโ€‹เบญเบดเบ”โ€‹. เปƒเบ™เบžเบฒเบชเบฒเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™, เบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเปเบšเบšเป€เบฅเบดเบเบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เบกเบฑเบเบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบเป‰เบญเบ™เบงเปˆเบฒเบกเบฑเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเป€เบฅเบฑเบเบ™เป‰เบญเบเปเบฅเบฐเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบกเบตเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบก. เบ‚เป‰เบญเบเบเบฑเบ‡เป„เบ”เป‰เป€เบฅเบทเบญเบเบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเบ„เบงเบฒเบกเป€เบฅเบดเบ - เบ—เปเบฒเบญเบดเบ”เบเป‰เบญเบ™เบงเปˆเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เปเบšเบšเบ”เบฑเป‰เบ‡เป€เบ”เบตเบกเบซเบผเบฒเบ.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบกเบฒเบฎเบญเบ”เป‚เบ„เบ‡เบเบฒเบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰. เบžเบงเบเป€เบฎเบปเบฒเบœเปˆเบฒเบ™เบˆเบธเบ”เบ•เบฑเป‰เบ‡เบ‚เบญเบ‡เบเบฒเบŸเป‚เบ”เบเปƒเบŠเป‰เบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเบ„เบงเบฒเบกเป€เบฅเบดเบเบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เปเบฅเบฐเบกเบญเบšเบซเบกเบฒเบเบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เปƒเบซเป‰เบžเบงเบเป€เบ‚เบปเบฒ, เบ›เปˆเบฝเบ™เบˆเปเบฒเบ™เบงเบ™เบชเปˆเบงเบ™เปเบšเปˆเบ‡เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบเป‰เบฒเบเบญเบญเบเป„เบ›เบ•เบฒเบกเปเบ„เบก. เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบžเบฐเบเบฒเบเบฒเบกเบกเบญเบšเบชเปˆเบงเบ™เปเบšเปˆเบ‡เปƒเบซเป‰เบเบฑเบšเบˆเบธเบ”เบชเบนเบ‡เบชเบธเบ”เบ—เบตเปˆเบกเบตเบชเปˆเบงเบ™เปเบšเปˆเบ‡เบ—เบตเปˆเบ–เบทเบเบกเบญเบšเบซเบกเบฒเบเปเบฅเป‰เบง, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบงเบปเป‰เบฒเป„เบ”เป‰เบขเปˆเบฒเบ‡เบ›เบญเบ”เป„เบžเบงเปˆเบฒเบเบฒเบŸเบšเปเปˆเปเบกเปˆเบ™ bipartite. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบˆเบธเบ”เบ•เบฑเป‰เบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบ–เบทเบเบกเบญเบšเบซเบกเบฒเบเบชเปˆเบงเบ™เปเบšเปˆเบ‡เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบšเบดเปˆเบ‡เบขเบนเปˆเปเบ„เบกเบ—เบฑเบ‡เบซเบกเบปเบ”, เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เบ—เบตเปˆเบ”เบต.

เบ„เบงเบฒเบกเบšเปเบฅเบดเบชเบธเบ”เบ‚เบญเบ‡เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆ

เปƒเบ™ Haskell เบžเบงเบเป€เบฎเบปเบฒเบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™ เบชเบฐเบญเบฒเบ”. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ–เป‰เบฒเบ™เบตเป‰เปเบกเปˆเบ™เบเปเบฅเบฐเบ™เบตเบขเปˆเบฒเบ‡เปเบ—เป‰เบˆเบดเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเปเปˆเบกเบตเบ—เบฒเบ‡เบ—เบตเปˆเบˆเบฐเบžเบดเบกเบชเบดเปˆเบ‡เปƒเบ”เปƒเบ™เบซเบ™เป‰เบฒเบˆเป. เบ—เบฑเบ‡เปเบปเบ”, เบชเบฐเบญเบฒเบ” เบเบฒเบ™โ€‹เบ„เบดเบ”โ€‹เป„เบฅเปˆโ€‹เปเบกเปˆเบ™ lazy เบ™เบฑเป‰เบ™โ€‹เบงเปˆเบฒโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบซเบ™เบถเปˆเบ‡โ€‹ เบชเบฐเบญเบฒเบ” เป€เบซเบ”เบœเบปเบ™เปƒเบ™เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡. เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ—เบฑเบ‡เปเบปเบ”เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เปเบกเปˆเบ™เบ–เบทเบเบšเบฑเบ‡เบ„เบฑเบšเปƒเบซเป‰เป€เบ‚เบปเป‰เบฒเปƒเบชเปˆเปƒเบ™เบšเบฒเบ‡เบงเบดเบ—เบต "เบšเปเปˆเบชเบฐเบญเบฒเบ”" Monad IO.

Monads เปเบกเปˆเบ™เบงเบดเบ—เบตเบเบฒเบ™เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบเบฑเบš เบœเบปเบ™เบเบฐเบ—เบปเบš เปƒเบ™ Haskell. เบเบฒเบ™เบญเบฐเบ—เบดเบšเบฒเบเบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เบงเปƒเบ”เปเบกเปˆเบ™เป€เบเบตเบ™เบ‚เบญเบšเป€เบ‚เบ”เบ‚เบญเบ‡เป‚เบžเบชเบ™เบตเป‰. เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ—เบตเปˆเบ”เบตเปเบฅเบฐเบŠเบฑเบ”เป€เบˆเบ™เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป€เบ›เบฑเบ™เบžเบฒเบชเบฒเบญเบฑเบ‡เบเบดเบ” เบ—เบตเปˆเบ™เบตเป‰.

เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบšเบฒเบ‡ monads, เป€เบŠเบฑเปˆเบ™ IO, เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™ compiler magic, เป€เบเบทเบญเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เบญเบทเปˆเบ™เป†เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบŠเบญเบšเปเบงเปเบฅเบฐเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบžเบงเบเบกเบฑเบ™เปเบกเปˆเบ™เบšเปเบฅเบดเบชเบธเบ”.

เบกเบตเบซเบผเบฒเบเบœเบปเบ™เบเบฐเบ—เบปเบšเปเบฅเบฐเปเบ•เปˆเบฅเบฐเบ„เบปเบ™เบกเบต monad เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡. เบ™เบตเป‰เปเบกเปˆเบ™เบ—เบดเบ”เบชเบฐเบ”เบตเบ—เบตเปˆเป€เบ‚เบฑเป‰เบกเปเบ‚เบ‡เปเบฅเบฐเบชเบงเบเบ‡เบฒเบกเบซเบผเบฒเบ: monads เบ—เบฑเบ‡เบซเบกเบปเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ”เบฝเบงเบเบฑเบ™. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบชเบฒเบก monads เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  • เบ—เบฑเบ‡ e a เปเบกเปˆเบ™เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ—เบตเปˆเปƒเบซเป‰เบ„เปˆเบฒเบ‚เบญเบ‡เบ›เบฐเป€เบžเบ” a เบซเบผเบทเบ–เบดเป‰เบกเบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™เบ‚เบญเบ‡เบ›เบฐเป€เบžเบ” e. เบžเบถเบ”เบ•เบดเบเปเบฒเบ‚เบญเบ‡ monad เบ™เบตเป‰เปเบกเปˆเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™เปƒเบ™เบžเบฒเบชเบฒเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™: เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบชเบฒเบกเบฒเบ”เบ–เบทเบเบˆเบฑเบšเป„เบ”เป‰เบซเบผเบทเบชเบปเปˆเบ‡เบ•เปเปˆ. เบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบ•เบปเป‰เบ™เบ•เปเปเบกเปˆเบ™เบงเปˆเบฒ monad เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™เปƒเบ™เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เปƒเบ™ Haskell, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบžเบฒเบชเบฒ imperative เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเปƒเบŠเป‰เบเบปเบ™เป„เบเบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™.
  • เบฅเบฑเบ” s a เปเบกเปˆเบ™เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เบ„เปˆเบฒเบ‚เบญเบ‡เบ›เบฐเป€เบžเบ” a เปเบฅเบฐเบกเบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบชเบฐเบ–เบฒเบ™เบฐเบ‚เบญเบ‡เบ›เบฐเป€เบžเบ” s.
  • เบšเบฒเบ‡เบ—เบต เบ. The Maybe monad เบชเบฐเปเบ”เบ‡เบญเบญเบเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เป„เบ”เป‰เบ—เบธเบเป€เบงเบฅเบฒเป‚เบ”เบเบเบฒเบ™เบเบฑเบšเบ„เบทเบ™เบšเปเปˆเบกเบตเบซเบเบฑเบ‡. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™ MonadPlus เบชเปเบฒเบฅเบฑเบšเบ›เบฐเป€เบžเบ” Maybe, เป€เบŠเบดเปˆเบ‡เบชเบฐเปเบ”เบ‡เบœเบปเบ™เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบก: เบกเบฑเบ™เป€เบ›เบฑเบ™เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เป„เบ”เป‰เบ—เบธเบเป€เบงเบฅเบฒเป‚เบ”เบเบเบฒเบ™เบชเบปเปˆเบ‡เบ„เบทเบ™เบ„เปˆเบฒเบชเบฐเป€เบžเบฒเบฐ.

เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบ‚เบญเบ‡ algorithmโ€‹

เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ‚เปเป‰เบกเบนเบ™เบชเบญเบ‡เบ›เบฐเป€เบžเบ”เบ„เบท Graph a เปเบฅเบฐ Bigraph a b, เบญเบฑเบ™เบ—เบณเบญเบดเบ”เบชเบฐเปเบ”เบ‡เป€เบ–เบดเบ‡เบเบฃเบฒเบŸเบ—เบตเปˆเบกเบตเปเบ™เบงเบ•เบฑเป‰เบ‡เบ•เบดเบ”เบชเบฐเบซเบผเบฒเบเบ”เป‰เบงเบเบ„เปˆเบฒเบ‚เบญเบ‡เบ›เบฐเป€เบžเบ” a, เปเบฅเบฐเบญเบฑเบ™เบ—เบตเบชเบญเบ‡เบชเบฐเปเบ”เบ‡เป€เบ–เบดเบ‡เบเบฃเบฒเบŸ bipartite เบ—เบตเปˆเบกเบตเบˆเบธเบ”เบ•เบฑเป‰เบ‡เบ”เป‰เบฒเบ™เบŠเป‰เบฒเบเบ•เบดเบ”เบชเบฐเบซเบผเบฒเบเบ”เป‰เบงเบเบ„เปˆเบฒเบ‚เบญเบ‡เบ›เบฐเป€เบžเบ” a เปเบฅเบฐเบ‚เบงเบฒ. -side vertices เบ•เบดเบ”โ€‹เบชเบฐโ€‹เบซเบผเบฒเบโ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบ„เบธเบ™โ€‹เบ„เปˆเบฒโ€‹เบ‚เบญเบ‡โ€‹เบ›เบฐโ€‹เป€เบžเบ” bโ€‹.

เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบ›เบฐเป€เบžเบ”เบˆเบฒเบเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” Alga. Alga เบšเปเปˆเบกเบตเบเบฒเบ™เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡เบเบฒเบŸ bipartite เบ—เบตเปˆเบšเปเปˆเบกเบตเบ—เบดเบ”เบ—เบฒเบ‡. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบฎเบฑเบ”เบ›เบฐเป€เบžเบ”เบ™เบตเป‰เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบŠเบฑเบ”เป€เบˆเบ™.

เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเบœเบนเป‰เบŠเปˆเบงเบเบ—เบตเปˆเบกเบตเบฅเบฒเบเป€เบŠเบฑเบ™เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

-- ะกะฟะธัะพะบ ัะพัะตะดะตะน ะดะฐะฝะฝะพะน ะฒะตั€ัˆะธะฝั‹.
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)

เบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบฅเบทเปˆเบญเบ‡เบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐเป€เบซเบฑเบ™เบงเปˆเบฒเบ–เป‰เบฒเปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเบ„เบงเบฒเบกเป€เบฅเบดเบเบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เบžเบงเบเป€เบฎเบปเบฒเบžเบปเบšเป€เบซเบฑเบ™เบ‚เบญเบšเป€เบ‚เบ”เบ—เบตเปˆเบ‚เบฑเบ”เปเบเป‰เบ‡เบเบฑเบ™, เบงเบปเบ‡เบˆเบญเบ™เบ„เบตเบเบขเบนเปˆเป€เบ—เบดเบ‡เบชเบธเบ”เบ‚เบญเบ‡ stack recursion. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบžเบทเปˆเบญเบŸเบทเป‰เบ™เบŸเบนเบกเบฑเบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบ•เบฑเบ”เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบญเบญเบเบˆเบฒเบ stack recursion เป€เบ–เบดเบ‡เบเบฒเบ™เบ›เบฐเบเบปเบ”เบ•เบปเบงเบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡ vertex เบชเบธเบ”เบ—เป‰เบฒเบ.

เบžเบงเบเป€เบฎเบปเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเบ„เบงเบฒเบกเป€เบฅเบดเบเบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เป‚เบ”เบเบเบฒเบ™เบฎเบฑเบเบชเบฒ array เบชเบฐเบกเบฒเบ„เบปเบกเบ‚เบญเบ‡เบ•เบปเบงเป€เบฅเบเบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบˆเบธเบ”. stack recursion เบˆเบฐเบ–เบทเบเบฎเบฑเบเบชเบฒเป„เบงเป‰เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡ Functor class เบ‚เบญเบ‡ monad เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบฅเบทเบญเบ: เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเป€เบญเบปเบฒเบˆเบธเบ”เบ•เบฑเป‰เบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฒเบเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เบˆเบฒเบเบซเบ™เป‰เบฒเบ—เบตเปˆ recursive.

เบ„เบงเบฒเบกเบ„เบดเบ”เบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบ‚เป‰เบญเบเปเบกเปˆเบ™เปƒเบŠเป‰ Either monad, เป€เบŠเบดเปˆเบ‡เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบœเบปเบ™เบเบฐเบ—เบปเบšเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™. เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบ‚เป‰เบญเบเบ‚เบฝเบ™เปเบกเปˆเบ™เปƒเบเป‰เบŠเบดเบ”เบเบฑเบšเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ™เบตเป‰. เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบกเบตเบซเป‰เบฒเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบขเบนเปˆเปƒเบ™เบˆเบธเบ”เบซเบ™เบถเปˆเบ‡เปเบฅเบฐเปƒเบ™เบ—เบตเปˆเบชเบธเบ”เบเปเปˆเป„เบ”เป‰เบ•เบปเบเบฅเบปเบ‡เบเบฑเบšเบญเบตเบเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡.

เบซเบ™เป‰เบฒเบ—เปเบฒเบญเบดเบ”, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฎเบฑเบเบชเบฒ array เบชเบฐเบกเบฒเบ„เบปเบกเบ‚เบญเบ‡เบ•เบปเบงเบฅเบฐเบšเบธเบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™ - เบ™เบตเป‰เปเบกเปˆเบ™เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบเปˆเบฝเบงเบเบฑเบšเบฅเบฑเบ”. เบญเบฑเบ™เบ—เบตเบชเบญเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเบฒเบกเบฒเบ”เบขเบธเบ”เป€เบŠเบปเบฒเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เบ‚เบฑเบ”เปเบเป‰เบ‡เป„เบ”เป‰เบ–เบทเบเบเบงเบ”เบžเบปเบš. เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™ Monad เบชเปเบฒเบฅเบฑเบšเบ—เบฑเบ‡เบชเบญเบ‡, เบซเบผเบท MonadPlus เบชเปเบฒเบฅเบฑเบšเบšเบฒเบ‡เบ—เบต. เบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบ—เบตเปˆ เบชเบณ เบ„เบฑเบ™เปเบกเปˆเบ™เบงเปˆเบฒเบ—เบฑเบ‡เบชเบญเบ‡เบชเบฒเบกเบฒเบ”เบชเบปเปˆเบ‡เบ„เบทเบ™เบ„เปˆเบฒเป„เบ”เป‰เบ–เป‰เบฒเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบขเบธเบ”, เปเบฅเบฐเบšเบฒเบ‡เบ—เบตเบญเบฒเบ”เบˆเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบžเบฝเบ‡เปเบ•เปˆเบ‚เปเป‰เบกเบนเบ™เบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ„เปˆเบฒเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบชเปเบฒเป€เบฅเบฑเบ” (เบกเบฑเบ™เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบฅเบฑเบ”), เบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบทเบญเบเบšเบฒเบ‡เบ—เบต. เปเบฅเบฐเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบชเบปเบกเบ—เบปเบšเบœเบปเบ™เบเบฐเบ—เบปเบšเบ‚เบญเบ‡เบชเบญเบ‡ monads, เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบญเบญเบเบกเบฒ monad transformers, เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบชเบปเบกเบ—เบปเบšเบœเบปเบ™เบเบฐเบ—เบปเบšเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰.

เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบ‚เป‰เบญเบเบˆเบถเปˆเบ‡เป€เบฅเบทเบญเบเบ›เบฐเป€เบžเบ”เบชเบฐเบฅเบฑเบšเบชเบฑเบšเบŠเป‰เบญเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง? เบชเบญเบ‡เป€เบซเบ”เบœเบปเบ™. เบ›เบฐเบเบฒเบ™เบ—เปเบฒเบญเบดเบ”, เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบšเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™. เบญเบฑเบ™เบ—เบตเบชเบญเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบซเบกเบนเบ™เปƒเบŠเป‰เบ„เปˆเบฒเบเบฑเบšเบ„เบทเบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบ„เบงเบฒเบกเบ‚เบฑเบ”เปเบเป‰เบ‡เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฑเบšเบ„เบทเบ™เบกเบฒเบˆเบฒเบเบเบฒเบ™ recursion เป€เบžเบทเปˆเบญเบŸเบทเป‰เบ™เบŸเบน loop odd, เป€เบŠเบดเปˆเบ‡เบ‡เปˆเบฒเบเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เปƒเบ™ Maybe monad.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ™เบตเป‰.

{-# 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)

เบšเปˆเบญเบ™เบ—เบตเปˆเบ•เบฑเบ™เปเบกเปˆเบ™เบซเบผเบฑเบเบ‚เบญเบ‡ algorithm. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเบญเบฐเบ—เบดเบšเบฒเบเบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™เบžเบฒเบเปƒเบ™เบกเบฑเบ™.

  • inVertex เปเบกเปˆเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเบ„เบงเบฒเบกเป€เบฅเบดเบเบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ›เบขเป‰เบฝเบกเบขเบฒเบก vertex เป€เบ›เบฑเบ™เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”. เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบกเบญเบšเบซเบกเบฒเบเป€เบฅเบเบชเปˆเบงเบ™เปเบšเปˆเบ‡เปƒเบซเป‰เบเบฑเบšเบˆเบธเบ”เบชเบนเบ‡เบชเบธเบ”เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ onEdge เปƒเบ™เป€เบžเบทเปˆเบญเบ™เบšเป‰เบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”. เบ™เบตเป‰เปเบกเปˆเบ™เบšเปˆเบญเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบŸเบทเป‰เบ™เบŸเบนเบเบฒเบ™เป€เบญเบตเป‰เบ™ stack: เบ–เป‰เบฒ msum เบชเบปเปˆเบ‡เบ„เบทเบ™เบ„เปˆเบฒ, เบžเบงเบเป€เบฎเบปเบฒเบเบนเป‰ vertex v เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™.
  • onEdge เปเบกเปˆเบ™เบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ›เบขเป‰เบฝเบกเบขเบฒเบกเบ‚เบญเบš. เบกเบฑเบ™เบ–เบทเบเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบชเบญเบ‡เบ„เบฑเป‰เบ‡เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบ‚เบญเบš. เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒ vertex เปƒเบ™เบญเบตเบเบ”เป‰เบฒเบ™เบซเบ™เบถเปˆเบ‡เป„เบ”เป‰เบ–เบทเบเป„เบ›เบขเป‰เบฝเบกเบขเบฒเบก, เปเบฅเบฐเป„เบ›เบขเป‰เบฝเบกเบขเบฒเบกเบกเบฑเบ™เบ–เป‰เบฒเบšเปเปˆเปเบกเปˆเบ™. เบ–เป‰เบฒเป„เบ”เป‰เป„เบ›เบขเป‰เบฝเบกเบขเบฒเบก, เบžเบงเบเป€เบฎเบปเบฒเบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบ‚เบญเบšเปเบกเปˆเบ™เบ‚เบฑเบ”เบเบฑเบ™เบšเป. เบ–เป‰เบฒเบกเบฑเบ™เป€เบ›เบฑเบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเบปเปˆเบ‡เบ„เบทเบ™เบ„เปˆเบฒ - เป€เบ—เบดเบ‡เบชเบธเบ”เบ‚เบญเบ‡ stack recursion, เบšเปˆเบญเบ™เบ—เบตเปˆเบเบญเบ”เบญเบทเปˆเบ™เป†เบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฐเบ–เบทเบเบงเบฒเบ‡เป„เบงเป‰เป€เบกเบทเปˆเบญเบเบฑเบšเบ„เบทเบ™.
  • processVertex เบเบงเบ”เป€เบšเบดเปˆเบ‡เปเบ•เปˆเบฅเบฐ vertex เบงเปˆเบฒเบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเป„เบ›เบขเป‰เบฝเบกเบขเบฒเบกเปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ inVertex เปƒเบชเปˆเบกเบฑเบ™เบซเบผเบทเบšเปเปˆ.
  • dfs เปเบฅเปˆเบ™ processVertex เปƒเบ™เบˆเบธเบ”เบ•เบฑเป‰เบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”.

เบซเบกเบปเบ”โ€‹เป€เบ—เบปเปˆเบฒโ€‹เบ™เบตเป‰.

เบ›เบฐเบซเบงเบฑเบ”เบ‚เบญเบ‡เบ„เปเบฒเบชเบฑเบš INLINE

เบ„เปเบฒเบงเปˆเบฒ INLINE เบšเปเปˆเป„เบ”เป‰เบขเบนเปˆเปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡ algorithm; เบกเบฑเบ™เบ›เบฒเบเบปเบ”เบ•เปเปˆเบกเบฒ. เป€เบกเบทเปˆเบญเบ‚เป‰เบญเบเบžเบฐเบเบฒเบเบฒเบกเบŠเบญเบเบซเบฒเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบ”เบตเบเบงเปˆเบฒ, เบ‚เป‰เบญเบเบžเบปเบšเบงเปˆเบฒเบชเบฐเบšเบฑเบšเบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™ INLINE เปเบกเปˆเบ™เบŠเป‰เบฒเบฅเบปเบ‡เบขเปˆเบฒเบ‡เป€เบซเบฑเบ™เป„เบ”เป‰เบŠเบฑเบ”เปƒเบ™เบšเบฒเบ‡เบเบฒเบŸ. เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบงเปˆเบฒเบซเบ™เป‰เบฒ semantic เบ„เบงเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ„เบทเบเบฑเบ™, เบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบ‚เป‰เบญเบเบ›เบฐเบซเบฅเบฒเบ”เปƒเบˆเบซเบฅเบฒเบ. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบ„เบปเบ™เปเบ›เบเบซเบ™เป‰เบฒ, เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบญเบทเปˆเบ™เบ—เบตเปˆเบกเบต GHC เบฎเบธเปˆเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบšเปเปˆเบกเบตเบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบ—เบตเปˆเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™.

เบซเบผเบฑเบ‡เบˆเบฒเบเปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบ™เบถเปˆเบ‡เบญเบฒเบ—เบดเบ”เปƒเบ™เบเบฒเบ™เบญเปˆเบฒเบ™เบœเบปเบ™เบœเบฐเบฅเบดเบ” GHC Core, เบ‚เป‰เบญเบเบชเบฒเบกเบฒเบ”เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบกเบตเป€เบชเบฑเป‰เบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡ INLINE เบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™. เปƒเบ™เบšเบฒเบ‡เบˆเบธเบ”เบฅเบฐเบซเบงเปˆเบฒเบ‡ GHC 8.4.4 เปเบฅเบฐ GHC 8.6.5, optimizer เบขเบธเบ”เป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰เบ”เป‰เบงเบเบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡.

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบšเปเปˆเป„เบ”เป‰เบ„เบฒเบ”เบซเบงเบฑเบ‡เบงเปˆเบฒเบˆเบฐเบžเบปเบšเบเบฑเบšเบเบธเปˆเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเปƒเบ™เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบก Haskell. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเปƒเบ™เบกเบทเป‰เบ™เบตเป‰, เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบœเบนเป‰เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเป€เบฎเบฑเบ”เบœเบดเบ”เบžเบฒเบ”, เปเบฅเบฐเบกเบฑเบ™เป€เบ›เบฑเบ™เบงเบฝเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ—เบตเปˆเบˆเบฐเปƒเบซเป‰เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ. เบ•เบปเบงเบขเปˆเบฒเบ‡, เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบฎเบนเป‰เบงเปˆเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆเบ„เบงเบ™เบˆเบฐเบขเบนเปˆเปƒเบ™เป€เบชเบฑเป‰เบ™เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบฑเบ™เบ–เบทเบ inlined เปƒเบ™เบชเบฐเบšเบฑเบš imperative, เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบˆเบฐเปƒเบซเป‰ compiler เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ.

เป€เบเบตเบ”เบซเบเบฑเบ‡เบ‚เบถเป‰เบ™เบ•เปเปˆเป„เบ›?

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบงเบดเบ—เบตเบเบฒเบ™ Hopcroft-Karp เบเบฑเบš monads เบญเบทเปˆเบ™เป†, เปเบฅเบฐเบ™เบฑเป‰เบ™เปเบกเปˆเบ™เบˆเบธเบ”เบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™.

เบ‚เปเบ‚เบญเบšเปƒเบˆเบเบฑเบš Google Summer of Code, เบ‚เป‰เบญเบเป„เบ”เป‰เบฎเบฑเบšเบ›เบฐเบชเบปเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบผเปเบเบผเบกเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”, เป€เบŠเบดเปˆเบ‡เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบŠเปˆเบงเบเปƒเบซเป‰เบ‚เป‰เบญเบเป„เบ”เป‰เบเบถเบเบ‡เบฒเบ™เบขเบนเปˆ Jane Street เปƒเบ™เบŠเปˆเบงเบ‡เบฅเบถเบฐเป€เบšเบดเปˆเบ‡เบฎเป‰เบญเบ™เบ•เปเปˆเป„เบ› (เบ‚เป‰เบญเบเบšเปเปˆเปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ™เบตเป‰เป€เบ›เบฑเบ™เบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเบ”เบตเบ›เบฒเบ™เปƒเบ”เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเปƒเบ™เบเบธเปˆเบกเบœเบนเป‰เบŠเบปเบกเบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบฎเบนเป‰เบ‚เบญเบ‡ Habr, เปเบ•เปˆเบงเปˆเบฒเบกเบฑเบ™เปเบกเปˆเบ™เบšเปˆเบญเบ™เบ”เบฝเบง. เบชเบญเบ‡เบชเบฒเบกเบšเปˆเบญเบ™เบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ•เบดเบžเบฒเบšเปƒเบ™เบฅเบฐเบ”เบนเบฎเป‰เบญเบ™), เปเบ•เปˆเบเบฑเบ‡เป„เบ”เป‰เปเบ™เบฐเบ™เปเบฒเบ‚เป‰เบญเบเป„เบ›เบชเบนเปˆเป‚เบฅเบเบ—เบตเปˆเบเบญเบ”เบขเป‰เบฝเบกเบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เปเบฒเบ‚เบงเบฑเบ™เบ™เบตเป‰เปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เป€เบŠเบดเปˆเบ‡เปเบ•เบเบ•เปˆเบฒเบ‡เบˆเบฒเบเบ›เบฐเบชเบปเบšเบเบฒเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเปƒเบ™เบžเบฒเบชเบฒเบžเบทเป‰เบ™เป€เบกเบทเบญเบ‡.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™