GSoC 2019: เชฆเซเชตเชฟเชชเช•เซเชทเซ€เชฏเชคเชพ เช…เชจเซ‡ เชฎเซ‹เชจเชพเชก เชŸเซเชฐเชพเชจเซเชธเชซเซ‹เชฐเซเชฎเชฐเซเชธ เชฎเชพเชŸเซ‡ เช—เซเชฐเชพเชซ เชคเชชเชพเชธเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ‡

เช—เชฏเชพ เช‰เชจเชพเชณเชพเชฎเชพเช‚ เชฎเซ‡เช‚ เชญเชพเช— เชฒเซ€เชงเซ‹ เชนเชคเซ‹ เช—เซ‚เช—เชฒ เชธเชฎเชฐ เช“เชซ เช•เซ‹เชก - Google เชจเชพ เชตเชฟเชฆเซเชฏเชพเชฐเซเชฅเซ€เช“ เชฎเชพเชŸเซ‡เชจเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ. เชฆเชฐ เชตเชฐเซเชทเซ‡, เช†เชฏเซ‹เชœเช•เซ‹ เช˜เชฃเชพ เช“เชชเชจ เชธเซ‹เชฐเซเชธ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธ เชชเชธเช‚เชฆ เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡เชฎเชพเช‚ เช†เชตเซ€ เชœเชพเชฃเซ€เชคเซ€ เชธเช‚เชธเซเชฅเชพเช“เชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡ Boost.org ะธ เชฒเชฟเชจเช•เซเชธ เชซเชพเช‰เชจเซเชกเซ‡เชถเชจ. Google เช† เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธ เชชเชฐ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชตเชฟเชถเซเชตเชญเชฐเชจเชพ เชตเชฟเชฆเซเชฏเชพเชฐเซเชฅเซ€เช“เชจเซ‡ เช†เชฎเช‚เชคเซเชฐเชฟเชค เช•เชฐเซ‡ เช›เซ‡. 

Google เชธเชฎเชฐ เช“เชซ เช•เซ‹เชก 2019 เชฎเชพเช‚ เชธเชนเชญเชพเช—เซ€ เชคเชฐเซ€เช•เซ‡, เชฎเซ‡เช‚ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เชฎเชพเช‚ เชเช• เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช•เชฐเซเชฏเซ‹ เช†เชฒเซเช—เชพ เชธเช‚เชธเซเชฅเชพ เชธเชพเชฅเซ‡ Haskell.org, เชœเซ‡ เชนเชพเชธเซเช•เซ‡เชฒ เชญเชพเชทเชพ เชตเชฟเช•เชธเชพเชตเซ€ เชฐเชนเซ€ เช›เซ‡ - เชธเซŒเชฅเซ€ เชชเซเชฐเช–เซเชฏเชพเชค เช•เชพเชฐเซเชฏเชพเชคเซเชฎเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชญเชพเชทเชพเช“เชฎเชพเช‚เชจเซ€ เชเช•. เช…เชฒเซเช—เชพ เชเช• เชชเซเชธเซเชคเช•เชพเชฒเชฏ เช›เซ‡ เชœเซ‡ เชฐเชœเซ‚ เช•เชฐเซ‡ เช›เซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เชฒเช–เซ‹ เชนเชพเชธเซเช•เซ‡เชฒเชฎเชพเช‚ เช—เซเชฐเชพเชซ เชฎเชพเชŸเซ‡ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเชคเซเชต. เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฅเชพเชฏ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชฎเชพเช‚ เช…เชฐเซเชฅเชชเซ‚เชฐเซเชฃ โ€” เชเช• เช—เซ€เชฅเชฌ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€ เชœเซ‡ เช•เซ‹เชกเชจเชพ เช†เชงเชพเชฐเซ‡ เชธเชฟเชฎเซ‡เชจเซเชŸเซ€เช• เชŸเซเชฐเซ€, เช•เซ‹เชฒ เช…เชจเซ‡ เชกเชฟเชชเซ‡เชจเซเชกเชจเซเชธเซ€ เช—เซเชฐเชพเชซ เชฌเชจเชพเชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ€ เชธเชฐเช–เชพเชฎเชฃเซ€ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. เชฎเชพเชฐเซ‹ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชคเซ‡ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเชคเซเชต เชฎเชพเชŸเซ‡ เชฆเซเชตเชฟเชชเช•เซเชทเซ€เชฏ เช—เซเชฐเชพเชซ เช…เชจเซ‡ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเซเชธ เชฎเชพเชŸเซ‡ เชเช• เชชเซเชฐเช•เชพเชฐ-เชธเชฒเชพเชฎเชค เชฐเชœเซ‚เช†เชค เช‰เชฎเซ‡เชฐเชตเชพเชจเซ‹ เชนเชคเซ‹. 

เช† เชชเซ‹เชธเซเชŸเชฎเชพเช‚ เชนเซเช‚ เชนเชพเชธเซเช•เซ‡เชฒเชฎเชพเช‚ เชฆเซเชตเชฟเชชเช•เซเชทเซ€เชฏเชคเชพ เชฎเชพเชŸเซ‡เชจเชพ เช—เซเชฐเชพเชซเชจเซ‡ เชคเชชเชพเชธเชตเชพ เชฎเชพเชŸเซ‡เชจเชพ เชฎเชพเชฐเชพ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเชจเชพ เช…เชฎเชฒ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เชถ. เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เชธเซŒเชฅเซ€ เชฎเซ‚เชณเชญเซ‚เชค เชชเซˆเช•เซ€เชจเซเช‚ เชเช• เชนเซ‹เชตเชพ เช›เชคเชพเช‚, เชคเซ‡เชจเซ‡ เช•เชพเชฐเซเชฏเชพเชคเซเชฎเช• เชถเซˆเชฒเซ€เชฎเชพเช‚ เชธเซเช‚เชฆเชฐ เชฐเซ€เชคเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชฅเซ€ เชฎเชจเซ‡ เช˜เชฃเซ€ เชชเซเชจเชฐเชพเชตเซƒเชคเซเชคเชฟเช“ เชฒเชพเช—เซ€ เช…เชจเซ‡ เช˜เชฃเซเช‚ เช•เชพเชฎ เช•เชฐเชตเซเช‚ เชชเชกเซเชฏเซเช‚. เชชเชฐเชฟเชฃเชพเชฎเซ‡, เชนเซเช‚ เชฎเซ‹เชจเชพเชก เชŸเซเชฐเชพเชจเซเชธเชซเซ‹เชฐเซเชฎเชฐเซเชธ เชธเชพเชฅเซ‡ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชชเชฐ เชธเซเชฅเชพเชฏเซ€ เชฅเชฏเซ‹. 

GSoC 2019: เชฆเซเชตเชฟเชชเช•เซเชทเซ€เชฏเชคเชพ เช…เชจเซ‡ เชฎเซ‹เชจเชพเชก เชŸเซเชฐเชพเชจเซเชธเชซเซ‹เชฐเซเชฎเชฐเซเชธ เชฎเชพเชŸเซ‡ เช—เซเชฐเชพเชซ เชคเชชเชพเชธเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ‡

เชฎเชพเชฐเชพ เชตเชฟเชถเซ‡

เชฎเชพเชฐเซเช‚ เชจเชพเชฎ เชตเซ‡เชธเชฟเชฒเซ€ เช…เชฒเซเชซเซ‡เชฐเซ‹เชต เช›เซ‡, เชนเซเช‚ เชธเซ‡เชจเซเชŸ เชชเซ€เชŸเชฐเซเชธเชฌเชฐเซเช— HSE เชฎเชพเช‚ เชšเซ‹เชฅเชพ เชตเชฐเซเชทเชจเซ‹ เชตเชฟเชฆเซเชฏเชพเชฐเซเชฅเซ€ เช›เซเช‚. เช…เช—เชพเช‰ เชฎเซ‡เช‚ เชฌเซเชฒเซ‹เช—เชฎเชพเช‚ เชฒเช–เซเชฏเซเช‚ เชนเชคเซเช‚ เชชเซ‡เชฐเชพเชฎเซ€เชŸเชฐเชพเช‡เชเซเชก เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเซเชธ เชตเชฟเชถเซ‡เชจเชพ เชฎเชพเชฐเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชตเชฟเชถเซ‡ ะธ เชเซเชฐเซ€เชนเซ‡เช•เชจเซ€ เชธเชซเชฐ เชตเชฟเชถเซ‡. เช…เชคเซเชฏเชพเชฐเซ‡ เชนเซเช‚ เช‡เชจเซเชŸเชฐเซเชจเชถเชฟเชช เชชเชฐ เช›เซเช‚ เชฌเชฐเซเช—เชจ เชฏเซเชจเชฟเชตเชฐเซเชธเชฟเชŸเซ€ เชจเซ‹เชฐเซเชตเซ‡เชฎเชพเช‚, เชœเซเชฏเชพเช‚ เชนเซเช‚ เชธเชฎเชธเซเชฏเชพเชจเชพ เช…เชญเชฟเช—เชฎ เชชเชฐ เช•เชพเชฎ เช•เชฐเซ€ เชฐเชนเซเชฏเซ‹ เช›เซเช‚ เชฏเชพเชฆเซ€ เชฐเช‚เช—. เชฎเชพเชฐเซ€ เชฐเซเชšเชฟเช“เชฎเชพเช‚ เชชเซ‡เชฐเชพเชฎเซ€เชŸเชฐเชพเช‡เชเซเชก เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเซเชธ เช…เชจเซ‡ เช•เชพเชฐเซเชฏเชพเชคเซเชฎเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช—เชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡.

เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชตเชฟเชถเซ‡

เชซเซ‹เชฐเชตเชฐเซเชก

เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚ เชญเชพเช— เชฒเซ‡เชจเชพเชฐเชพ เชตเชฟเชฆเซเชฏเชพเชฐเซเชฅเซ€เช“เชจเซ‡ เชฌเซเชฒเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชญเชพเชฐเชชเซ‚เชฐเซเชตเช• เชชเซเชฐเซ‹เชคเซเชธเชพเชนเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชคเซ‡เช“เช เชฎเชจเซ‡ เชฌเซเชฒเซ‹เช— เชฎเชพเชŸเซ‡ เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ เชชเซ‚เชฐเซเช‚ เชชเชพเชกเซเชฏเซเช‚ เชนเชพเชธเซเช•เซ‡เชฒเชจเซ‹ เช‰เชจเชพเชณเซ‹. เช† เชฒเซ‡เช– เช…เชจเซเชตเชพเชฆ เช›เซ‡ เชฒเซ‡เช–, เชฎเชพเชฐเชพ เชฆเซเชตเชพเชฐเชพ เชœเซเชฒเชพเช‡เชฎเชพเช‚ เช…เช‚เช—เซเชฐเซ‡เชœเซ€เชฎเชพเช‚ เชฒเช–เชพเชฏเซ‡เชฒเซเช‚, เชŸเซ‚เช‚เช•เซ€ เชชเซเชฐเชธเซเชคเชพเชตเชจเชพ เชธเชพเชฅเซ‡. 

เชชเซเชฐเชถเซเชจเชฎเชพเช‚ เช•เซ‹เชก เชธเชพเชฅเซ‡ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡ เช…เชนเซ€เช‚.

เชคเชฎเซ‡ เชฎเชพเชฐเชพ เช•เชพเชฐเซเชฏเชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‹ เชตเชฟเชถเซ‡ เชตเชพเช‚เชšเซ€ เชถเช•เซ‹ เช›เซ‹ (เช…เช‚เช—เซเชฐเซ‡เชœเซ€เชฎเชพเช‚) เช…เชนเซ€เช‚.

เช† เชชเซ‹เชธเซเชŸ เชงเชพเชฐเซ‡ เช›เซ‡ เช•เซ‡ เชตเชพเชšเช• เชตเชฟเชงเซ‡เชฏเชพเชคเซเชฎเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช—เชจเชพ เชฎเซ‚เชณเชญเซ‚เชค เช–เซเชฏเชพเชฒเซ‹เชฅเซ€ เชชเชฐเชฟเชšเชฟเชค เช›เซ‡, เชœเซ‹ เช•เซ‡ เชœเซเชฏเชพเชฐเซ‡ เชธเชฎเชฏ เช†เชตเชถเซ‡ เชคเซเชฏเชพเชฐเซ‡ เชนเซเช‚ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชคเชพ เชคเชฎเชพเชฎ เชถเชฌเซเชฆเซ‹เชจเซ‡ เชฏเชพเชฆ เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เชถ.

เชฆเซเชตเชฟเชชเช•เซเชทเซ€เชฏเชคเชพ เชฎเชพเชŸเซ‡ เช†เชฒเซ‡เช– เชคเชชเชพเชธเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡ 

เชฆเซเชตเชฟเชชเช•เซเชทเซ€เชฏเชคเชพ เชฎเชพเชŸเซ‡ เช—เซเชฐเชพเชซ เชคเชชเชพเชธเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชธเซŒเชฅเซ€ เชธเชฐเชณ เช—เซเชฐเชพเชซ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเซเชธเชฎเชพเช‚เชจเชพ เชเช• เชคเชฐเซ€เช•เซ‡ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเซเชธเชจเชพ เช•เซ‹เชฐเซเชธเชฎเชพเช‚ เช†เชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชคเซ‡เชฎเชจเซ‹ เชตเชฟเชšเชพเชฐ เชธเซ€เชงเซ‹ เช›เซ‡: เชชเชนเซ‡เชฒเชพ เช†เชชเชฃเซ‡ เช•เซ‹เชˆเช• เชฐเซ€เชคเซ‡ เชกเชพเชฌเซ‡ เช…เชฅเชตเชพ เชœเชฎเชฃเชพ เชถเซ‡เชฐเชฎเชพเช‚ เชถเชฟเชฐเซ‹เชฌเชฟเช‚เชฆเซเช“ เชฎเซ‚เช•เซ€เช เช›เซ€เช, เช…เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชตเชฟเชฐเซ‹เชงเชพเชญเชพเชธเซ€ เชงเชพเชฐ เชฎเชณเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เช…เชฎเซ‡ เชญเชพเชฐเชชเซ‚เชฐเซเชตเช• เช•เชนเซ€เช เช›เซ€เช เช•เซ‡ เช†เชฒเซ‡เช– เชฆเซเชตเชฟเชชเช•เซเชทเซ€เชฏ เชจเชฅเซ€.

เชฅเซ‹เชกเซ€ เชตเชงเซ เชตเชฟเช—เชค: เชชเชนเซ‡เชฒเชพ เช†เชชเชฃเซ‡ เชกเชพเชฌเชพ เชถเซ‡เชฐเชฎเชพเช‚ เช•เซ‡เชŸเชฒเชพเช• เชถเชฟเชฐเซ‹เชฌเชฟเช‚เชฆเซ เชฎเซ‚เช•เซ€เช เช›เซ€เช. เชฆเซ‡เช–เซ€เชคเซ€ เชฐเซ€เชคเซ‡, เช† เชถเชฟเชฐเซ‹เชฌเชฟเช‚เชฆเซเชจเชพ เชฌเชงเชพ เชชเชกเซ‹เชถเซ€เช“ เชœเชฎเชฃเชพ เชฒเซ‹เชฌเชฎเชพเช‚ เช†เชตเซ‡เชฒเชพ เชนเซ‹เชตเชพ เชœเซ‹เชˆเช. เช†เช—เชณ, เช† เชถเชฟเชฐเซ‹เชฌเชฟเช‚เชฆเซเชจเชพ เชชเชกเซ‹เชถเซ€เช“เชจเชพ เชคเชฎเชพเชฎ เชชเชกเซ‹เชถเซ€เช“ เชกเชพเชฌเชพ เชฒเซ‹เชฌเชฎเชพเช‚ เช†เชตเซ‡เชฒเชพ เชนเซ‹เชตเชพ เชœเซ‹เชˆเช, เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชตเชงเซ. เช…เชฎเซ‡ เชถเชฟเชฐเซ‹เชฌเชฟเช‚เชฆเซเช“เชจเซ‡ เชถเซ‡เชฐ เช…เชธเชพเช‡เชจ เช•เชฐเชตเชพเชจเซเช‚ เชšเชพเชฒเซ เชฐเชพเช–เซ€เช เช›เซ€เช เชœเซเชฏเชพเช‚ เชธเซเชงเซ€ เช…เชฎเซ‡ เชชเชกเซ‹เชถเซ€เช“เชจเซ‡ เชธเซ‹เช‚เชชเซเชฏเชพ เชจเชฅเซ€ เชคเซ‡เชตเชพ เชถเชฟเชฐเซ‹เชฌเชฟเช‚เชฆเซเชจเชพ เช•เชจเซ‡เช•เซเชŸเซ‡เชก เช˜เชŸเช•เชฎเชพเช‚ เชนเชœเซ เชชเชฃ เชถเชฟเชฐเซ‹เชฌเชฟเช‚เชฆเซเช“ เช›เซ‡. เชชเช›เซ€ เช…เชฎเซ‡ เชฌเชงเชพ เช•เชจเซ‡เช•เซเชŸเซ‡เชก เช˜เชŸเช•เซ‹ เชฎเชพเชŸเซ‡ เช† เช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เช•เชฐเซ€เช เช›เซ€เช.

เชœเซ‹ เชธเชฎเชพเชจ เชชเชพเชฐเซเชŸเซ€เชถเชจเชฎเชพเช‚ เช†เชตเชคเชพ เชถเชฟเชฐเซ‹เชฌเชฟเช‚เชฆเซเช“ เชตเชšเซเชšเซ‡ เช•เซ‹เชˆ เชงเชพเชฐ เชนเซ‹เชฏ, เชคเซ‹ เช—เซเชฐเชพเชซเชฎเชพเช‚ เชเช• เชตเชฟเชšเชฟเชคเซเชฐ เชšเช•เซเชฐ เชถเซ‹เชงเชตเซเช‚ เชฎเซเชถเซเช•เซ‡เชฒ เชจเชฅเซ€, เชœเซ‡ เชฆเซเชตเชฟเชชเช•เซเชทเซ€เชฏ เช—เซเชฐเชพเชซเชฎเชพเช‚ เชตเซเชฏเชพเชชเช•เชชเชฃเซ‡ เชœเชพเชฃเซ€เชคเซเช‚ เช›เซ‡ (เช…เชจเซ‡ เชคเชฆเซเชฆเชจ เชธเซเชชเชทเซเชŸ เชฐเซ€เชคเซ‡) เช…เชถเช•เซเชฏ เช›เซ‡. เชจเชนเชฟเช‚เชคเชฐ, เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชฏเซ‹เช—เซเชฏ เชชเชพเชฐเซเชŸเซ€เชถเชจ เช›เซ‡, เชœเซ‡เชจเซ‹ เช…เชฐเซเชฅ เช›เซ‡ เช•เซ‡ เช—เซเชฐเชพเชซ เชฆเซเชตเชฟเชชเช•เซเชทเซ€เชฏ เช›เซ‡.

เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เช† เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชชเชนเซ‹เชณเชพเชˆ เชชเซเชฐเชฅเชฎ เชถเซ‹เชง เช…เชฅเชตเชพ เชŠเช‚เชกเชพเชˆ เชชเซเชฐเชฅเชฎ เชถเซ‹เชง. เช†เชตเชถเซเชฏเช• เชญเชพเชทเชพเช“เชฎเชพเช‚, เชŠเช‚เชกเชพเชฃ-เชชเซเชฐเชฅเชฎ เชถเซ‹เชงเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชฅเชพเชฏ เช›เซ‡ เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เชธเชนเซ‡เชœ เชธเชฐเชณ เช›เซ‡ เช…เชจเซ‡ เชตเชงเชพเชฐเชพเชจเชพ เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€. เชฎเซ‡เช‚ เชŠเช‚เชกเชพเชฃ-เชชเซเชฐเชฅเชฎ เชถเซ‹เชง เชชเชฃ เชชเชธเช‚เชฆ เช•เชฐเซ€ เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เชตเชงเซ เชชเชฐเช‚เชชเชฐเชพเช—เชค เช›เซ‡.

เช†เชฎ, เช…เชฎเซ‡ เชจเซ€เชšเซ‡เชจเซ€ เชฏเซ‹เชœเชจเชพ เชชเชฐ เช†เชตเซเชฏเชพ. เช…เชฎเซ‡ เชŠเช‚เชกเชพเชฃ-เชชเซเชฐเชฅเชฎ เชถเซ‹เชงเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช—เซเชฐเชพเชซเชจเชพ เชถเชฟเชฐเซ‹เชฌเชฟเช‚เชฆเซเช“เชจเซ‡ เชชเชพเชฐ เช•เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ‡ เชถเซ‡เชฐ เช…เชธเชพเช‡เชจ เช•เชฐเซ€เช เช›เซ€เช, เชœเซ‡เชฎ เชœเซ‡เชฎ เช†เชชเชฃเซ‡ เชงเชพเชฐ เชธเชพเชฅเซ‡ เช†เช—เชณ เชตเชงเซ€เช เช›เซ€เช เชคเซ‡เชฎ เชถเซ‡เชฐเชจเซ€ เชธเช‚เช–เซเชฏเชพ เชฌเชฆเชฒเซ€เช เช›เซ€เช. เชœเซ‹ เช†เชชเชฃเซ‡ เชเชตเชพ เชถเชฟเชฐเซ‹เชฌเชฟเช‚เชฆเซเชจเซ‡ เชถเซ‡เชฐ เช…เชธเชพเช‡เชจ เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เช เช•เซ‡ เชœเซ‡เชฎเชพเช‚ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชถเซ‡เชฐ เช…เชธเชพเช‡เชจ เช•เชฐเซ‡เชฒ เชนเซ‹เชฏ, เชคเซ‹ เช…เชฎเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เชฐเซ€เชคเซ‡ เช•เชนเซ€ เชถเช•เซ€เช เช•เซ‡ เช†เชฒเซ‡เช– เชฆเซเชตเชฟเชชเช•เซเชทเซ€เชฏ เชจเชฅเซ€. เชœเซ‡ เช•เซเชทเชฃเซ‡ เชฌเชงเชพ เชถเชฟเชฐเซ‹เชฌเชฟเช‚เชฆเซเช“เชจเซ‡ เชเช• เชถเซ‡เชฐ เชธเซ‹เช‚เชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เช…เชฎเซ‡ เชฌเชงเซ€ เช•เชฟเชจเชพเชฐเซ€เช“ เชœเซ‹เชˆ เชฒเซ€เชงเซ€ เช›เซ‡, เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชเช• เชธเชพเชฐเซเช‚ เชชเชพเชฐเซเชŸเซ€เชถเชจ เช›เซ‡.

เช—เชฃเชคเชฐเซ€เช“เชจเซ€ เชถเซเชฆเซเชงเชคเชพ

เชนเชพเชธเซเช•เซ‡เชฒเชฎเชพเช‚ เช†เชชเชฃเซ‡ เชงเชพเชฐเซ€เช เช›เซ€เช เช•เซ‡ เชฌเชงเซ€ เช—เชฃเชคเชฐเซ€เช“ เช›เซ‡ เชšเซ‹เช–เซเช–เซ‹. เชœเซ‹ เช•เซ‡, เชœเซ‹ เช† เช–เชฐเซ‡เช–เชฐ เช•เซ‡เชธ เชนเซ‹เชค, เชคเซ‹ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชธเซเช•เซเชฐเซ€เชจ เชชเชฐ เช•เช‚เชˆเชชเชฃ เช›เชพเชชเชตเชพเชจเซ‹ เช•เซ‹เชˆ เชฐเชธเซเชคเซ‹ เชจ เชนเซ‹เชค. เชฌเชงเชพ เชชเชฐ, เชšเซ‹เช–เซเช–เซ‹ เช—เชฃเชคเชฐเซ€เช“ เชเชŸเชฒเซ€ เช†เชณเชธเซ เช›เซ‡ เช•เซ‡ เชคเซเชฏเชพเช‚ เชเช• เชชเชฃ เชจเชฅเซ€ เชšเซ‹เช–เซเช–เซ‹ เช•เช‚เชˆเช• เช—เชฃเชคเชฐเซ€ เชฎเชพเชŸเซ‡ เช•เชพเชฐเชฃเซ‹. เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚ เชฅเชคเซ€ เชคเชฎเชพเชฎ เช—เชฃเชคเชฐเซ€เช“ เช•เซ‹เชˆเช• เชฐเซ€เชคเซ‡ เชซเชฐเชœ เชชเชพเชกเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ "เช…เชถเซเชฆเซเชง" เชฎเซ‹เชจเชพเชก เช†เช‡เช“.

เชฎเซ‹เชจเชพเชกเซเชธ เช เช—เชฃเชคเชฐเซ€เช“เชจเซ‡ เชฐเชœเซ‚ เช•เชฐเชตเชพเชจเซ€ เชเช• เชฐเซ€เชค เช›เซ‡ เช…เชธเชฐเซ‹ เชนเชพเชธเซเช•เซ‡เชฒเชฎเชพเช‚. เชคเซ‡เช“ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชธเชฎเชœเชพเชตเชตเซเช‚ เช† เชชเซ‹เชธเซเชŸเชจเชพ เช…เชตเช•เชพเชถเชจเซ€ เชฌเชนเชพเชฐ เช›เซ‡. เช…เช‚เช—เซเชฐเซ‡เชœเซ€เชฎเชพเช‚ เชธเชพเชฐเซเช‚ เช…เชจเซ‡ เชธเซเชชเชทเซเชŸ เชตเชฐเซเชฃเชจ เชตเชพเช‚เชšเซ€ เชถเช•เชพเชฏ เช›เซ‡ เช…เชนเซ€เช‚.

เช…เชนเซ€เช‚ เชนเซเช‚ เช เชจเชฟเชฐเซเชฆเซ‡เชถ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚ เช•เซ‡ เชœเซเชฏเชพเชฐเซ‡ เช•เซ‡เชŸเชฒเชพเช• เชฎเซ‹เชจเชพเชกเซเชธ, เชœเซ‡เชฎ เช•เซ‡ 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 เช เชŠเช‚เชกเชพเชฃ-เชชเซเชฐเชฅเชฎ เชถเซ‹เชงเชจเซ‹ เชญเชพเช— เช›เซ‡ เชœเซเชฏเชพเช‚ เช†เชชเชฃเซ‡ เชชเซเชฐเชฅเชฎ เชตเช–เชค เชถเชฟเชฐเซ‹เชฌเชฟเช‚เชฆเซเชจเซ€ เชฎเซเชฒเชพเช•เชพเชค เชฒเชˆเช เช›เซ€เช. เช…เชนเซ€เช‚ เช†เชชเชฃเซ‡ เชถเชฟเชฐเซ‹เชฌเชฟเช‚เชฆเซเชจเซ‡ เชถเซ‡เชฐ เชจเช‚เชฌเชฐ เช…เชธเชพเช‡เชจ เช•เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ เชฌเชงเชพ เชชเชกเซ‹เชถเซ€เช“ เชชเชฐ onEdge เชšเชฒเชพเชตเซ€เช เช›เซ€เช. เช† เชคเซ‡ เช›เซ‡ เชœเซเชฏเชพเช‚ เช†เชชเชฃเซ‡ เช•เซ‰เชฒ เชธเซเชŸเซ‡เช•เชจเซ‡ เชชเซเชจเชƒเชธเซเชฅเชพเชชเชฟเชค เช•เชฐเซ€เช เช›เซ€เช: เชœเซ‹ msum เชฎเซ‚เชฒเซเชฏ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡, เชคเซ‹ เช…เชฎเซ‡ เชถเชฟเชฐเซ‹เชฌเชฟเช‚เชฆเซ v เชคเซเชฏเชพเช‚ เชฆเชฌเชพเชฃ เช•เชฐเซ€เช เช›เซ€เช.
  • onEdge เช เชญเชพเช— เช›เซ‡ เชœเซเชฏเชพเช‚ เช†เชชเชฃเซ‡ เชงเชพเชฐเชจเซ€ เชฎเซเชฒเชพเช•เชพเชค เชฒเชˆเช เช›เซ€เช. เชคเซ‡ เชฆเชฐเซ‡เช• เชงเชพเชฐ เชฎเชพเชŸเซ‡ เชฌเซ‡ เชตเชพเชฐ เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช…เชนเซ€เช‚ เช†เชชเชฃเซ‡ เชคเชชเชพเชธเซ€เช เช›เซ€เช เช•เซ‡ เชฌเซ€เชœเซ€ เชฌเชพเชœเซเชจเชพ เชถเชฟเชฐเซ‹เชฌเชฟเช‚เชฆเซเชจเซ€ เชฎเซเชฒเชพเช•เชพเชค เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡ เช•เซ‡ เชจเชนเซ€เช‚, เช…เชจเซ‡ เชœเซ‹ เชจ เชนเซ‹เชฏ เชคเซ‹ เชคเซ‡เชจเซ€ เชฎเซเชฒเชพเช•เชพเชค เชฒเชˆเช. เชœเซ‹ เชฎเซเชฒเชพเช•เชพเชค เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡, เชคเซ‹ เช…เชฎเซ‡ เชคเชชเชพเชธ เช•เชฐเซ€เช เช›เซ€เช เช•เซ‡ เชงเชพเชฐ เชตเชฟเชฐเซ‹เชงเชพเชญเชพเชธเซ€ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ. เชœเซ‹ เชคเซ‡ เชนเซ‹เชฏ, เชคเซ‹ เช…เชฎเซ‡ เชฎเซ‚เชฒเซเชฏ เชชเชฐเชค เช•เชฐเซ€เช เช›เซ€เช - เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชธเซเชŸเซ‡เช•เชจเซ€ เช–เซ‚เชฌ เชœ เชŸเซ‹เชš, เชœเซเชฏเชพเช‚ เช…เชจเซเชฏ เชคเชฎเชพเชฎ เชถเชฟเชฐเซ‹เชฌเชฟเช‚เชฆเซเช“ เชชเช›เซ€ เชชเชพเช›เชพ เชซเชฐเชตเชพ เชชเชฐ เชฎเซ‚เช•เชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.
  • เชชเซเชฐเซ‹เชธเซ‡เชธเชตเชฐเซเชŸเซ‡เช•เซเชธ เชฆเชฐเซ‡เช• เชถเชฟเชฐเซ‹เชฌเชฟเช‚เชฆเซ เชฎเชพเชŸเซ‡ เชคเชชเชพเชธ เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เชถเซเช‚ เชคเซ‡เชจเซ€ เชฎเซเชฒเชพเช•เชพเชค เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡ เช…เชจเซ‡ เชœเซ‹ เชจ เชนเซ‹เชฏ เชคเซ‹ เชคเซ‡เชจเชพ เชชเชฐ เชตเชฐเซเชŸเซ‡เช•เซเชธ เชšเชฒเชพเชตเซ‡ เช›เซ‡.
  • dfs เชฌเชงเชพ เชถเชฟเชฐเซ‹เชฌเชฟเช‚เชฆเซเช“ เชชเชฐ เชชเซเชฐเซ‹เชธเซ‡เชธเชตเชฐเซเชŸเซ‡เช•เซเชธ เชšเชฒเชพเชตเซ‡ เช›เซ‡.

เชฌเชธ.

เช‡เชจเชฒเชพเช‡เชจ เชถเชฌเซเชฆเชจเซ‹ เช‡เชคเชฟเชนเชพเชธ

INLINE เชถเชฌเซเชฆ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเชจเชพ เชชเซเชฐเชฅเชฎ เช…เชฎเชฒเซ€เช•เชฐเชฃเชฎเชพเช‚ เชจ เชนเชคเซ‹; เชคเซ‡ เชชเช›เซ€เชฅเซ€ เชฆเซ‡เช–เชพเชฏเซ‹. เชœเซเชฏเชพเชฐเซ‡ เชฎเซ‡เช‚ เชฌเชนเซ‡เชคเชฐ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชถเซ‹เชงเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซเชฏเซ‹, เชคเซเชฏเชพเชฐเซ‡ เชฎเซ‡เช‚ เชœเซ‹เชฏเซเช‚ เช•เซ‡ เชฌเชฟเชจ-เชˆเชจเชฒเชพเชˆเชจ เชธเช‚เชธเซเช•เชฐเชฃ เช•เซ‡เชŸเชฒเชพเช• เช—เซเชฐเชพเชซ เชชเชฐ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฐเซ€เชคเซ‡ เชงเซ€เชฎเซเช‚ เชนเชคเซเช‚. เชธเชฟเชฎเซ‡เชจเซเชŸเซ€เช•เชฒเซ€ เชซเช‚เช•เซเชถเชจเซเชธ เช เชœ เช•เชพเชฎ เช•เชฐเชตเซเช‚ เชœเซ‹เชˆเช เชคเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‡เชคเชพ, เช†เชจเชพเชฅเซ€ เชฎเชจเซ‡ เช–เซ‚เชฌ เชœ เช†เชถเซเชšเชฐเซเชฏ เชฅเชฏเซเช‚. เช…เชœเชพเชฃเซ€ เชตเซเชฏเช•เซเชคเชฟ เชชเชฃ, GHC เชจเชพ เชญเชฟเชจเซเชจ เชธเช‚เชธเซเช•เชฐเชฃเชตเชพเชณเชพ เช…เชจเซเชฏ เชฎเชถเซ€เชจ เชชเชฐ เช•เซ‹เชˆ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชคเชซเชพเชตเชค เชจเชนเซ‹เชคเซ‹.

GHC เช•เซ‹เชฐ เช†เช‰เชŸเชชเซเชŸ เชตเชพเช‚เชšเชตเชพเชฎเชพเช‚ เชเช• เช…เช เชตเชพเชกเชฟเชฏเซเช‚ เช—เชพเชณเซเชฏเชพ เชชเช›เซ€, เชนเซเช‚ เชธเซเชชเชทเซเชŸ เช‡เชจเชฒเชพเช‡เชจเชจเซ€ เชเช• เชฒเชพเช‡เชจเชฅเซ€ เชธเชฎเชธเซเชฏเชพเชจเซ‡ เช เซ€เช• เช•เชฐเชตเชพเชฎเชพเช‚ เชธเช•เซเชทเชฎ เชนเชคเซ‹. GHC 8.4.4 เช…เชจเซ‡ GHC 8.6.5 เชจเซ€ เชตเชšเซเชšเซ‡ เช…เชฎเซเช• เชธเชฎเชฏเซ‡ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเชฐเซ‡ เช† เชœเชพเชคเซ‡ เช•เชฐเชตเชพเชจเซเช‚ เชฌเช‚เชง เช•เชฐเซเชฏเซเช‚.

เชฎเซ‡เช‚ เชนเชพเชธเซเช•เซ‡เชฒ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช—เชฎเชพเช‚ เช†เชตเซ€ เช—เช‚เชฆเช•เซ€เชจเซ‹ เชธเชพเชฎเชจเซ‹ เช•เชฐเชตเชพเชจเซ€ เช…เชชเซ‡เช•เซเชทเชพ เชจเชนเซ‹เชคเซ€ เช•เชฐเซ€. เชœเซ‹ เช•เซ‡, เช†เชœเซ‡ เชชเชฃ, เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเชฐเซเชธ เช•เซ‡เชŸเชฒเซ€เช•เชตเชพเชฐ เชญเซ‚เชฒเซ‹ เช•เชฐเซ‡ เช›เซ‡, เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ‡ เชธเช‚เช•เซ‡เชคเซ‹ เช†เชชเชตเชพเชจเซเช‚ เช…เชฎเชพเชฐเซเช‚ เช•เชพเชฎ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช…เชนเซ€เช‚ เช†เชชเชฃเซ‡ เชœเชพเชฃเซ€เช เช›เซ€เช เช•เซ‡ เชซเช‚เช•เซเชถเชจ เช‡เชจเชฒเชพเช‡เชจ เชนเซ‹เชตเซเช‚ เชœเซ‹เชˆเช เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เช…เชจเชฟเชตเชพเชฐเซเชฏ เชธเช‚เชธเซเช•เชฐเชฃเชฎเชพเช‚ เช‡เชจเชฒเชพเช‡เชจ เช›เซ‡, เช…เชจเซ‡ เช† เช•เชฎเซเชชเชพเช‡เชฒเชฐเชจเซ‡ เชธเช‚เช•เซ‡เชค เช†เชชเชตเชพเชจเซเช‚ เชเช• เช•เชพเชฐเชฃ เช›เซ‡.

เช†เช—เชณ เชถเซเช‚ เชฅเชฏเซเช‚?

เชชเช›เซ€ เชฎเซ‡เช‚ เช…เชจเซเชฏ เชฎเซ‹เชจเชพเชกเซเชธ เชธเชพเชฅเซ‡ เชนเซ‹เชชเช•เซเชฐเซ‹เชซเซเชŸ-เช•เชพเชฐเซเชช เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเชจเซ‹ เช…เชฎเชฒ เช•เชฐเซเชฏเซ‹, เช…เชจเซ‡ เชคเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‹ เช…เช‚เชค เชนเชคเซ‹.

Google เชธเชฎเชฐ เช‘เชซ เช•เซ‹เชกเชจเซ‹ เช†เชญเชพเชฐ, เชฎเซ‡เช‚ เชซเช‚เช•เซเชถเชจเชฒ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช—เชฎเชพเช‚ เชตเซเชฏเชตเชนเชพเชฐเซ เช…เชจเซเชญเชต เชฎเซ‡เชณเชตเซเชฏเซ‹, เชœเซ‡เชฃเซ‡ เชฎเชจเซ‡ เช†เชตเชคเชพ เช‰เชจเชพเชณเชพเชฎเชพเช‚ เชœเซ‡เชจ เชธเซเชŸเซเชฐเซ€เชŸ เช–เชพเชคเซ‡ เช‡เชจเซเชŸเชฐเซเชจเชถเชฟเชช เชฎเซ‡เชณเชตเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ€. เชตเชฟเชงเซ‡เชฏเชพเชคเซเชฎเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช—เชฎเชพเช‚ เชธเชพเชฎเซ‡เชฒ เชฅเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเซ‡ เช‰เชจเชพเชณเซ‹ เช•เชฐเซ€ เชถเช•เซ‹ เชคเซ‡เชตเชพ เชฅเซ‹เชกเชพเชฎเชพเช‚เชฅเซ€), เชชเชฃ เชชเชฐเช‚เชชเชฐเชพเช—เชค เชญเชพเชทเชพเช“เชฎเชพเช‚ เชฎเชพเชฐเชพ เช…เชจเซเชญเชต เช•เชฐเชคเชพเช‚ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฐเซ€เชคเซ‡ เช…เชฒเช—, เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช‚ เช† เชฆเชพเช–เชฒเชพเชจเซ‡ เชฒเชพเช—เซ เช•เชฐเชตเชพเชจเซ€ เช…เชฆเซเชญเซเชค เชฆเซเชจเชฟเชฏเชพ เชธเชพเชฅเซ‡ เชชเชฃ เชฎเชจเซ‡ เชชเชฐเชฟเชšเชฏ เช•เชฐเชพเชตเซเชฏเซ‹.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹