GSoC 2019: ื‘ื“ื™ืงืช ื’ืจืคื™ื ืขื‘ื•ืจ ืฉื ืื™ ื“ื•-ืฆื“ื“ื™ื•ืช ื•ืžื•ื ืื•ืช

ื‘ืงื™ืฅ ืฉืขื‘ืจ ื”ืฉืชืชืคืชื™ ืงื™ืฅ ืฉืœ Google ืงื•ื“ - ืชื•ื›ื ื™ืช ืœืกื˜ื•ื“ื ื˜ื™ื ืžื’ื•ื’ืœ. ืžื“ื™ ืฉื ื” ื‘ื•ื—ืจื™ื ื”ืžืืจื’ื ื™ื ืžืกืคืจ ืคืจื•ื™ืงื˜ื™ื ื‘ืงื•ื“ ืคืชื•ื—, ื›ื•ืœืœ ืžืืจื’ื•ื ื™ื ื™ื“ื•ืขื™ื ื›ืžื• Boost.org ะธ ืงืจืŸ ืœื™ื ื•ืงืก. ื’ื•ื’ืœ ืžื–ืžื™ื ื” ืชืœืžื™ื“ื™ื ืžื›ืœ ื”ืขื•ืœื ืœืขื‘ื•ื“ ืขืœ ื”ืคืจื•ื™ืงื˜ื™ื ื”ืืœื”. 

ื›ืžืฉืชืชืฃ ื‘-Google Summer of Code 2019, ืขืฉื™ืชื™ ืคืจื•ื™ืงื˜ ื‘ืชื•ืš ื”ืกืคืจื™ื™ื” ืืฆื” ืขื ื”ืืจื’ื•ืŸ Haskell.org, ืืฉืจ ืžืคืชื—ืช ืืช ืฉืคืช Haskell - ืื—ืช ืžืฉืคื•ืช ื”ืชื›ื ื•ืช ื”ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ื”ืžืคื•ืจืกืžื•ืช ื‘ื™ื•ืชืจ. ืืฆื” ื”ื™ื ืกืคืจื™ื™ื” ืฉืžื™ื™ืฆื’ืช ืกื•ื’ ื‘ื˜ื•ื— ื™ื™ืฆื•ื’ ืœื’ืจืคื™ื ื‘- Haskell. ื”ื•ื ืžืฉืžืฉ, ืœืžืฉืœ, ื‘ ืกืžื ื˜ื™ - ืกืคืจื™ื™ืช Github ืฉื‘ื•ื ื” ืขืฆื™ื ืกืžื ื˜ื™ื™ื, ื’ืจืคื™ ืฉื™ื—ื•ืช ื•ืชืœื•ืช ื”ืžื‘ื•ืกืกื™ื ืขืœ ืงื•ื“ ื•ื™ื›ื•ืœื” ืœื”ืฉื•ื•ืช ื‘ื™ื ื™ื”ื. ื”ืคืจื•ื™ืงื˜ ืฉืœื™ ื”ื™ื” ืœื”ื•ืกื™ืฃ ื™ื™ืฆื•ื’ ื‘ื˜ื•ื— ืœืกื•ื’ื™ื ืขื‘ื•ืจ ื’ืจืคื™ื ื“ื•-ืฆื“ื“ื™ื™ื ื•ืืœื’ื•ืจื™ืชืžื™ื ืขื‘ื•ืจ ื”ื™ื™ืฆื•ื’ ื”ื–ื”. 

ื‘ืคื•ืกื˜ ื–ื” ืื“ื‘ืจ ืขืœ ื”ื™ื™ืฉื•ื ืฉืœื™ ืฉืœ ืืœื’ื•ืจื™ืชื ืœื‘ื“ื™ืงืช ื’ืจืฃ ืขื‘ื•ืจ ื“ื•-ืฆื“ื“ื™ื•ืช ื‘- Haskell. ืœืžืจื•ืช ืฉื”ืืœื’ื•ืจื™ืชื ื”ื•ื ืื—ื“ ื”ื‘ืกื™ืกื™ื™ื ื‘ื™ื•ืชืจ, ืœื™ื™ืฉื ืื•ืชื• ื‘ืฆื•ืจื” ื™ืคื” ื‘ืกื’ื ื•ืŸ ืคื•ื ืงืฆื™ื•ื ืœื™ ืœืงื— ืœื™ ืžืกืคืจ ืื™ื˜ืจืฆื™ื•ืช ื•ื“ืจืฉ ื“ื™ ื”ืจื‘ื” ืขื‘ื•ื“ื”. ื›ืชื•ืฆืื” ืžื›ืš, ื”ืกืชืคืงืชื™ ื‘ื™ื™ืฉื•ื ืขื ืฉื ืื™ ืžื•ื ื“ื•ืช. 

GSoC 2019: ื‘ื“ื™ืงืช ื’ืจืคื™ื ืขื‘ื•ืจ ืฉื ืื™ ื“ื•-ืฆื“ื“ื™ื•ืช ื•ืžื•ื ืื•ืช

ืขืœ ืขืฆืžื™

ืฉืžื™ ื•ืืกื™ืœื™ ืืœืคืจื•ื‘, ืื ื™ ืกื˜ื•ื“ื ื˜ ืฉื ื” ืจื‘ื™ืขื™ืช ื‘ืกื ื˜ ืคื˜ืจื‘ื•ืจื’ HSE. ืžื•ืงื“ื ื™ื•ืชืจ ื‘ื‘ืœื•ื’ ื›ืชื‘ืชื™ ืขืœ ื”ืคืจื•ื™ืงื˜ ืฉืœื™ ืขืœ ืืœื’ื•ืจื™ืชืžื™ื ืขื ืคืจืžื˜ืจื™ื ะธ ืขืœ ื”ื˜ื™ื•ืœ ืœZuriHac. ื›ืจื’ืข ืื ื™ ื‘ื”ืชืžื—ื•ืช ื‘ ืื•ื ื™ื‘ืจืกื™ื˜ืช ื‘ืจื’ืŸ ื‘ื ื•ืจื‘ื’ื™ื”, ืฉื ืื ื™ ืขื•ื‘ื“ ืขืœ ื’ื™ืฉื•ืช ืœื‘ืขื™ื” ืฆื‘ื™ืขื” ืจืฉื™ืžื”. ืชื—ื•ืžื™ ื”ืขื ื™ื™ืŸ ืฉืœื™ ื›ื•ืœืœื™ื ืืœื’ื•ืจื™ืชืžื™ื ืขื ืคืจืžื˜ืจื™ื ื•ืชื›ื ื•ืช ืคื•ื ืงืฆื™ื•ื ืœื™.

ืขืœ ื™ื™ืฉื•ื ื”ืืœื’ื•ืจื™ืชื

ืคึฐึผืชึดื™ื—ึท

ืกื˜ื•ื“ื ื˜ื™ื ื”ืžืฉืชืชืคื™ื ื‘ืชื•ื›ื ื™ืช ืžื•ื–ืžื ื™ื ืžืื•ื“ ืœื›ืชื•ื‘ ื‘ืœื•ื’. ื”ื ืกื™ืคืงื• ืœื™ ืคืœื˜ืคื•ืจืžื” ืœื‘ืœื•ื’ ืงื™ืฅ ืฉืœ ื”ืืกืงืœ. ืžืืžืจ ื–ื” ื”ื•ื ืชืจื’ื•ื ืžืืžืจื™ื, ืฉื ื›ืชื‘ ืขืœ ื™ื“ื™ ืฉื ื‘ื™ื•ืœื™ ื‘ืื ื’ืœื™ืช, ืขื ื”ืงื“ืžื” ืงืฆืจื”. 

ื ื™ืชืŸ ืœืžืฆื•ื Pull Request ืขื ื”ืงื•ื“ ื”ืžื“ื•ื‘ืจ ื›ืืŸ.

ืืชื” ื™ื›ื•ืœ ืœืงืจื•ื ืขืœ ืชื•ืฆืื•ืช ื”ืขื‘ื•ื“ื” ืฉืœื™ (ื‘ืื ื’ืœื™ืช) ื›ืืŸ.

ืคื•ืกื˜ ื–ื” ื ื•ืขื“ ืœื”ื›ื™ืจ ืœืงื•ืจื ืืช ื”ืžื•ืฉื’ื™ื ื”ื‘ืกื™ืกื™ื™ื ื‘ืชื›ื ื•ืช ืคื•ื ืงืฆื™ื•ื ืœื™, ืื ื›ื™ ืื ืกื” ืœื”ื™ื–ื›ืจ ื‘ื›ืœ ื”ืžื•ื ื—ื™ื ื‘ื”ื ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ื‘ื•ื ื”ื–ืžืŸ.

ื‘ื“ื™ืงืช ื’ืจืคื™ื ืœื“ื•-ืฆื“ื“ื™ื•ืช 

ืืœื’ื•ืจื™ืชื ืœื‘ื“ื™ืงืช ื’ืจืฃ ืœื“ื•-ื—ืœืงื™ื•ืช ื ื™ืชืŸ ื‘ื“ืจืš ื›ืœืœ ื‘ืงื•ืจืก ืขืœ ืืœื’ื•ืจื™ืชืžื™ื ื›ืื—ื“ ืžืืœื’ื•ืจื™ืชืžื™ ื”ื’ืจืคื™ื ื”ืคืฉื•ื˜ื™ื ื‘ื™ื•ืชืจ. ื”ืจืขื™ื•ืŸ ืฉืœื• ืคืฉื•ื˜: ืชื—ื™ืœื” ืื ื• ืื™ื›ืฉื”ื• ืฉืžื™ื ืงื•ื“ืงื•ื“ื™ื ื‘ื—ืœืง ื”ืฉืžืืœื™ ืื• ื”ื™ืžื ื™, ื•ื›ืืฉืจ ื ืžืฆื ืงืฆื” ืกื•ืชืจ, ืื ื• ื˜ื•ืขื ื™ื ืฉื”ื’ืจืฃ ืื™ื ื• ื“ื•-ื—ืœืงื™.

ืงืฆืช ื™ื•ืชืจ ืคื™ืจื•ื˜: ืจืืฉื™ืช ืฉืžื ื• ืงื•ื“ืงื•ื“ ื›ืœืฉื”ื• ื‘ื—ืœืง ื”ืฉืžืืœื™. ื‘ืจื•ืจ ืฉื›ืœ ื”ืฉื›ื ื™ื ืฉืœ ื”ืงื•ื“ืงื•ื“ ื”ื–ื” ื—ื™ื™ื‘ื™ื ืœืฉื›ื‘ ื‘ืื•ื ื” ื”ื™ืžื ื™ืช. ื™ืชืจ ืขืœ ื›ืŸ, ื›ืœ ื”ืฉื›ื ื™ื ืฉืœ ื”ืฉื›ื ื™ื ืฉืœ ืงื•ื“ืงื•ื“ ื–ื” ื—ื™ื™ื‘ื™ื ืœืฉื›ื‘ ื‘ืื•ื ื” ื”ืฉืžืืœื™ืช, ื•ื›ืŸ ื”ืœืื”. ืื ื• ืžืžืฉื™ื›ื™ื ืœื”ืงืฆื•ืช ืฉื™ืชื•ืคื™ื ืœืงื•ื“ืงื•ื“ื™ื ื›ืœ ืขื•ื“ ื™ืฉ ืงื•ื“ืงื•ื“ื™ื ื‘ืจื›ื™ื‘ ื”ืžื—ื•ื‘ืจ ืฉืœ ื”ืงื•ื“ืงื•ื“ ืื™ืชื• ื”ืชื—ืœื ื• ืฉืœื ื”ืงืฆื™ื ื• ืœื”ื ืฉื›ื ื™ื. ืœืื—ืจ ืžื›ืŸ ื ื—ื–ื•ืจ ืขืœ ืคืขื•ืœื” ื–ื• ืขื‘ื•ืจ ื›ืœ ื”ืจื›ื™ื‘ื™ื ื”ืžื—ื•ื‘ืจื™ื.

ืื ื™ืฉ ืงืฆื” ื‘ื™ืŸ ืงื•ื“ืงื•ื“ื™ื ืฉื ื•ืคืœื™ื ืœืื•ืชื” ืžื—ื™ืฆื”, ืœื ืงืฉื” ืœืžืฆื•ื ืžื—ื–ื•ืจ ืื™ ื–ื•ื’ื™ ื‘ื’ืจืฃ, ื“ื‘ืจ ื”ื™ื“ื•ืข (ื•ื“ื™ ื‘ืจื•ืจ) ื‘ืœืชื™ ืืคืฉืจื™ ื‘ื’ืจืฃ ื“ื•-ื—ืœืงื™. ืื—ืจืช, ื™ืฉ ืœื ื• ืžื—ื™ืฆื” ื ื›ื•ื ื”, ืžื” ืฉืื•ืžืจ ืฉื”ื’ืจืฃ ื”ื•ื ื“ื•-ื—ืœืงื™.

ื‘ื“ืจืš ื›ืœืœ, ืืœื’ื•ืจื™ืชื ื–ื” ืžื™ื•ืฉื ื‘ืืžืฆืขื•ืช ืจื•ื—ื‘ ื—ื™ืคื•ืฉ ืจืืฉื•ืŸ ืื• ืขื•ืžืง ื—ื™ืคื•ืฉ ืจืืฉื•ืŸ. ื‘ืฉืคื•ืช ื”ื›ืจื—ื™, ื‘ื“ืจืš ื›ืœืœ ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ื—ื™ืคื•ืฉ ืขื•ืžืง ืจืืฉื•ืŸ ืžื›ื™ื•ื•ืŸ ืฉื”ื•ื ืžืขื˜ ืคืฉื•ื˜ ื™ื•ืชืจ ื•ืื™ื ื• ื“ื•ืจืฉ ืžื‘ื ื™ ื ืชื•ื ื™ื ื ื•ืกืคื™ื. ื‘ื—ืจืชื™ ื’ื ื‘ื—ื™ืคื•ืฉ ืขื•ืžืง-ืจืืฉื•ืŸ ืžื›ื™ื•ื•ืŸ ืฉื”ื•ื ืžืกื•ืจืชื™ ื™ื•ืชืจ.

ืœืคื™ื›ืš, ื”ื’ืขื ื• ืœืชื›ื ื™ืช ื”ื‘ืื”. ืื ื• ื—ื•ืฆื™ื ืืช ืงื•ื“ืงื•ื“ื™ ื”ื’ืจืฃ ื‘ืืžืฆืขื•ืช ื—ื™ืคื•ืฉ ืขื•ืžืง ืจืืฉื•ืŸ ื•ืžืงืฆื™ื ืœื”ื ืฉื™ืชื•ืคื™ื, ืžืฉื ื™ื ืืช ืžืกืคืจ ื”ืฉื™ืชื•ืฃ ืชื•ืš ื›ื“ื™ ืชื ื•ืขื” ืœืื•ืจืš ื”ืงืฆื”. ืื ื ื ืกื” ืœื”ืงืฆื•ืช ืฉื™ืชื•ืฃ ืœืงื•ื“ืงื•ื“ ืฉื›ื‘ืจ ื”ื•ืงืฆื” ืœื• ืฉื™ืชื•ืฃ, ื ื•ื›ืœ ืœื•ืžืจ ื‘ื‘ื˜ื—ื” ืฉื”ื’ืจืฃ ืื™ื ื• ื“ื•-ื—ืœืงื™. ื‘ืจื’ืข ืฉื›ืœ ื”ืงื•ื“ืงื•ื“ื™ื ืžื•ืงืฆื™ื ืฉื™ืชื•ืฃ ื•ื‘ื“ืงื ื• ืืช ื›ืœ ื”ืงืฆื•ื•ืช, ื™ืฉ ืœื ื• ืžื—ื™ืฆื” ื˜ื•ื‘ื”.

ื˜ื•ื”ืจ ื”ื—ื™ืฉื•ื‘ื™ื

ื‘ื”ืกืงืœ ืื ื• ืžื ื™ื—ื™ื ืฉื›ืœ ื”ื—ื™ืฉื•ื‘ื™ื ื”ื ืœึฐื ึทืงื•ึนืช. ืขื ื–ืืช, ืื ื–ื” ื”ื™ื” ื‘ืืžืช ื”ืžืงืจื”, ืœื ื”ื™ื™ืชื” ืœื ื• ื“ืจืš ืœื”ื“ืคื™ืก ืฉื•ื ื“ื‘ืจ ืœืžืกืš. ื‘ื›ืœืœ, ื ืงื™ ื”ื—ื™ืฉื•ื‘ื™ื ื›ืœ ื›ืš ืขืฆืœื ื™ื ืฉืื™ืŸ ืื—ื“ ื ืงื™ ืกื™ื‘ื•ืช ืœื—ืฉื‘ ืžืฉื”ื•. ื›ืœ ื”ื—ื™ืฉื•ื‘ื™ื ื”ืžืชืจื—ืฉื™ื ื‘ืชื•ื›ื ื™ืช ื ืืœืฆื™ื ืื™ื›ืฉื”ื• ืœื”ื™ื›ื ืก "ื˜ึธืžึตื" ืžื•ื ืื“ื” IO.

ืžื•ื ืื“ื•ืช ื”ืŸ ื“ืจืš ืœื™ื™ืฆื’ ื—ื™ืฉื•ื‘ื™ื ืื™ืชื” ืืคืงื˜ื™ื ื‘ื”ืืกืงืœ. ื”ืกื‘ืจ ื›ื™ืฆื“ ื”ื ืคื•ืขืœื™ื ื”ื•ื ืžืขื‘ืจ ืœืชื—ื•ื ื”ืคื•ืกื˜ ื”ื–ื”. ืชื™ืื•ืจ ื˜ื•ื‘ ื•ื‘ืจื•ืจ ื ื™ืชืŸ ืœืงืจื•ื ื‘ืื ื’ืœื™ืช ื›ืืŸ.

ื›ืืŸ ืื ื™ ืจื•ืฆื” ืœืฆื™ื™ืŸ ืฉื‘ืขื•ื“ ื›ืžื” ืžื•ื ืื•ืช, ื›ืžื• IO, ืžื™ื•ืฉืžื•ืช ื‘ืืžืฆืขื•ืช ืงืกื ืžื”ื“ืจ, ื›ืžืขื˜ ื›ืœ ื”ืื—ืจื•ืช ืžื™ื•ืฉืžื•ืช ื‘ืชื•ื›ื ื” ื•ื›ืœ ื”ื—ื™ืฉื•ื‘ื™ื ื‘ื”ืŸ ื˜ื”ื•ืจื™ื.

ื™ืฉ ื”ืจื‘ื” ืืคืงื˜ื™ื ื•ืœื›ืœ ืื—ื“ ื™ืฉ ืืช ื”ืžื•ื ืื“ื” ืฉืœื•. ื–ื•ื”ื™ ืชื™ืื•ืจื™ื” ืžืื•ื“ ื—ื–ืงื” ื•ื™ืคื”: ื›ืœ ื”ืžื•ื ืื•ืช ืžื™ื™ืฉืžื•ืช ืืช ืื•ืชื• ืžืžืฉืง. ื ื“ื‘ืจ ืขืœ ืฉืœื•ืฉ ื”ืžื•ื ืื“ื•ืช ื”ื‘ืื•ืช:

  • ืื• ea ื”ื•ื ื—ื™ืฉื•ื‘ ืฉืžื—ื–ื™ืจ ืขืจืš ืžืกื•ื’ a ืื• ื–ื•ืจืง ื—ืจื™ื’ ืžืกื•ื’ e. ื”ื”ืชื ื”ื’ื•ืช ืฉืœ ื”ืžื•ื ืื“ื” ื”ื–ื• ื“ื•ืžื” ืžืื•ื“ ืœื˜ื™ืคื•ืœ ื‘ื—ืจื™ื’ื™ื ื‘ืฉืคื•ืช ืฆื™ื•ื•ื™: ื ื™ืชืŸ ืœืชืคื•ืก ืฉื’ื™ืื•ืช ืื• ืœื”ืขื‘ื™ืจ ืื•ืชืŸ ื”ืœืื”. ื”ื”ื‘ื“ืœ ื”ืขื™ืงืจื™ ื”ื•ื ืฉื”ืžื•ื ืื“ื” ืžื™ื•ืฉืžืช ื‘ืื•ืคืŸ ื”ื’ื™ื•ื ื™ ืœื—ืœื•ื˜ื™ืŸ ื‘ืกืคืจื™ื™ื” ื”ืกื˜ื ื“ืจื˜ื™ืช ื‘- Haskell, ื‘ืขื•ื“ ืฉืฉืคื•ืช ืฆื™ื•ื•ื™ ืžืฉืชืžืฉื•ืช ื‘ื“ืจืš ื›ืœืœ ื‘ืžื ื’ื ื•ื ื™ ืžืขืจื›ืช ื”ื”ืคืขืœื”.
  • ืžืฆื‘ sa ื”ื•ื ื—ื™ืฉื•ื‘ ืฉืžื—ื–ื™ืจ ืขืจืš ืžืกื•ื’ a ื•ื™ืฉ ืœื• ื’ื™ืฉื” ืœืžืฆื‘ ื ื™ืชืŸ ืœืฉื™ื ื•ื™ ืžืกื•ื’ s.
  • ืื•ืœื™. ื”ืžื•ื ืื“ื” ืื•ืœื™ ืžื‘ื˜ืืช ื—ื™ืฉื•ื‘ ืฉื ื™ืชืŸ ืœื”ืคืจื™ืข ื‘ื›ืœ ืขืช ืขืœ ื™ื“ื™ ื”ื—ื–ืจืช ื›ืœื•ื. ืขื ื–ืืช, ื ื“ื‘ืจ ืขืœ ื”ื˜ืžืขืช ืžื—ืœืงื” MonadPlus ืœืกื•ื’ Maybe, ื”ืžื‘ื˜ื ืืช ื”ื”ืฉืคืขื” ื”ื”ืคื•ื›ื”: ืžื“ื•ื‘ืจ ื‘ื—ื™ืฉื•ื‘ ืฉื ื™ืชืŸ ืœื”ืคืจื™ืข ื‘ื›ืœ ืขืช ืขืœ ื™ื“ื™ ื”ื—ื–ืจืช ืขืจืš ืกืคืฆื™ืคื™.

ื™ื™ืฉื•ื ื”ืืœื’ื•ืจื™ืชื

ื™ืฉ ืœื ื• ืฉื ื™ ืกื•ื’ื™ ื ืชื•ื ื™ื, ื’ืจืฃ 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)

ืงืœ ืœืจืื•ืช ืฉืื ื‘ืžื”ืœืš ื”ื—ื™ืคื•ืฉ ื”ืขื•ืžืง-ืจืืฉื•ืŸ ืžืฆืื ื• ืงืฆื” ืกื•ืชืจ, ื”ืžื—ื–ื•ืจ ื”ืžื•ื–ืจ ื ืžืฆื ืขืœ ื’ื‘ื™ ืขืจื™ืžืช ื”ืจืงื•ืจืกื™ื”. ืœืคื™ื›ืš, ื›ื“ื™ ืœืฉื—ื–ืจ ืื•ืชื•, ืขืœื™ื ื• ืœื ืชืง ื”ื›ืœ ืžื—ืกื ื™ืช ื”ืจืงื•ืจืกื™ื” ื•ืขื“ ืœื”ืชืจื—ืฉื•ืช ื”ืจืืฉื•ื ื” ืฉืœ ื”ืงื•ื“ืงื•ื“ ื”ืื—ืจื•ืŸ.

ืื ื• ืžื™ื™ืฉืžื™ื ื—ื™ืคื•ืฉ ืขื•ืžืง ืจืืฉื•ืŸ ืขืœ ื™ื“ื™ ืฉืžื™ืจื” ืขืœ ืžืขืจืš ืืกื•ืฆื™ืื˜ื™ื‘ื™ ืฉืœ ืžืกืคืจื™ ืฉื™ืชื•ืฃ ืขื‘ื•ืจ ื›ืœ ืงื•ื“ืงื•ื“. ืžื—ืกื ื™ืช ื”ืจืงื•ืจืกื™ื” ืชื™ืฉืžืจ ืื•ื˜ื•ืžื˜ื™ืช ื‘ืืžืฆืขื•ืช ื™ื™ืฉื•ื ืžื—ืœืงืช ื”-Functor ืฉืœ ื”ืžื•ื ืื“ื” ืฉื‘ื—ืจื ื•: ื ืฆื˜ืจืš ืจืง ืœื”ื›ื ื™ืก ืืช ื›ืœ ื”ืงื•ื“ืงื•ื“ื™ื ืžื”ื ืชื™ื‘ ืœืชื•ืฆืื” ื”ืžื•ื—ื–ืจืช ืžื”ืคื•ื ืงืฆื™ื” ื”ืจืงื•ืจืกื™ื‘ื™ืช.

ื”ืจืขื™ื•ืŸ ื”ืจืืฉื•ืŸ ืฉืœื™ ื”ื™ื” ืœื”ืฉืชืžืฉ ื‘ืžื•ื ืื“ื” "Ether", ืฉื ืจืื” ื›ื™ ืžื™ื™ืฉืžืช ื‘ื“ื™ื•ืง ืืช ื”ื”ืฉืคืขื•ืช ืฉืื ื• ืฆืจื™ื›ื™ื. ื”ื™ื™ืฉื•ื ื”ืจืืฉื•ืŸ ืฉื›ืชื‘ืชื™ ื”ื™ื” ืงืจื•ื‘ ืžืื•ื“ ืœืืคืฉืจื•ืช ื”ื–ื•. ืœืžืขืฉื”, ื”ื™ื• ืœื™ ื—ืžื™ืฉื” ื™ื™ืฉื•ืžื™ื ืฉื•ื ื™ื ื‘ืฉืœื‘ ืžืกื•ื™ื ื•ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ ื”ืกืชืคืงืชื™ ื‘ืื—ื“ ืื—ืจ.

ืจืืฉื™ืช, ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœืฉืžื•ืจ ืขืœ ืžืขืจืš ืืกื•ืฆื™ืื˜ื™ื‘ื™ ืฉืœ ืžื–ื”ื™ ืฉื™ืชื•ืฃ - ื–ื” ืžืฉื”ื• ืœื’ื‘ื™ State. ืฉื ื™ืช, ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื”ื™ื•ืช ืžืกื•ื’ืœื™ื ืœืขืฆื•ืจ ื›ืืฉืจ ืžืชื’ืœื” ืงื•ื ืคืœื™ืงื˜. ื–ื” ื™ื›ื•ืœ ืœื”ื™ื•ืช Monad ืขื‘ื•ืจ ื›ืœ ืื—ื“, ืื• MonadPlus ืขื‘ื•ืจ ืื•ืœื™. ื”ื”ื‘ื“ืœ ื”ืขื™ืงืจื™ ื”ื•ื ืฉืื—ื“ ืžื”ื ื™ื›ื•ืœ ืœื”ื—ื–ื™ืจ ืขืจืš ืื ื”ื—ื™ืฉื•ื‘ ืœื ื”ื•ืคืกืง, ื•ืื•ืœื™ ืžื—ื–ื™ืจ ืจืง ืžื™ื“ืข ืขืœ ื–ื” ื‘ืžืงืจื” ื–ื”. ืžื›ื™ื•ื•ืŸ ืฉืื ื—ื ื• ืœื ืฆืจื™ื›ื™ื ืขืจืš ื ืคืจื“ ืœื”ืฆืœื—ื” (ื”ื•ื ื›ื‘ืจ ืžืื•ื—ืกืŸ ื‘-State), ืื ื—ื ื• ื‘ื•ื—ืจื™ื ืื•ืœื™. ื•ื‘ืจื’ืข ืฉื‘ื• ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœืฉืœื‘ ืืช ื”ื”ืฉืคืขื•ืช ืฉืœ ืฉืชื™ ืžื•ื ืื“ื•ืช, ื”ืŸ ื™ื•ืฆืื•ืช ื”ื—ื•ืฆื” ืฉื ืื™ ืžื•ื ืื•ืช, ื”ืžืฉืœื‘ื™ื ื‘ื“ื™ื•ืง ืืช ื”ื”ืฉืคืขื•ืช ื”ืœืœื•.

ืœืžื” ื‘ื—ืจืชื™ ื‘ืกื•ื’ ื›ืœ ื›ืš ืžื•ืจื›ื‘? ืฉืชื™ ืกื™ื‘ื•ืช. ืจืืฉื™ืช, ื”ื™ื™ืฉื•ื ืžืชื‘ืจืจ ื›ื“ื•ืžื” ืžืื•ื“ ืœืฆื™ื•ื•ื™. ืฉื ื™ืช, ืขืœื™ื ื• ืœืชืžืจืŸ ืืช ืขืจืš ื”ื”ื—ื–ืจื” ื‘ืžืงืจื” ืฉืœ ืงื•ื ืคืœื™ืงื˜ ื›ืืฉืจ ื—ื•ื–ืจื™ื ืžื”ืจืงื•ืจืกื™ื” ื›ื“ื™ ืœืฉื—ื–ืจ ืืช ื”ืœื•ืœืื” ื”ืื™ ื–ื•ื’ื™ืช, ืžื” ืฉื”ืจื‘ื” ื™ื•ืชืจ ืงืœ ืœืขืฉื•ืช ื‘ืžื•ื ืื“ื” ืื•ืœื™.

ื›ืš ืื ื• ืžืงื‘ืœื™ื ืืช ื”ื™ื™ืฉื•ื ื”ื–ื”.

{-# 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 ื”ื•ื ื”ื—ืœืง ืฉื‘ื• ืื ื• ืžื‘ืงืจื™ื ื‘ืงืฆื”. ื–ื” ื ืงืจื ืคืขืžื™ื™ื ืขื‘ื•ืจ ื›ืœ ืงืฆื”. ื›ืืŸ ืื ื• ื‘ื•ื“ืงื™ื ืื ื”ืงื•ื“ืงื•ื“ ื‘ืฆื“ ื”ืฉื ื™ ื‘ื™ืงืจ, ื•ืžื‘ืงืจื™ื ื‘ื• ืื ืœื. ืื ื‘ื™ืงืจื ื•, ืื ื• ื‘ื•ื“ืงื™ื ืื ื”ืงืฆื” ืกื•ืชืจ. ืื ื›ืŸ, ื ื—ื–ื™ืจ ืืช ื”ืขืจืš - ื”ื—ืœืง ื”ืขืœื™ื•ืŸ ืฉืœ ืขืจื™ืžืช ื”ืจืงื•ืจืกื™ื”, ืฉื ื›ืœ ืฉืืจ ื”ืงื•ื“ืงื•ื“ื™ื ื™ื•ืฆื‘ื• ืœืื—ืจ ื”ื—ื–ืจื”.
  • processVertex ื‘ื•ื“ืง ืขื‘ื•ืจ ื›ืœ ืงื•ื“ืงื•ื“ ืื ื‘ื™ืงืจ ื‘ื• ื•ืžืคืขื™ืœ ืขืœื™ื• inVertex ืื ืœื.
  • dfs ืžืจื™ืฅ ืืช processVertex ืขืœ ื›ืœ ื”ืงื•ื“ืงื•ื“ื™ื.

ื–ื” ื”ื›ืœ.

ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื”ืžื™ืœื” INLINE

ื”ืžื™ืœื” INLINE ืœื ื”ื™ื™ืชื” ื‘ื™ื™ืฉื•ื ื”ืจืืฉื•ืŸ ืฉืœ ื”ืืœื’ื•ืจื™ืชื; ื”ื™ื ื”ื•ืคื™ืขื” ืžืื•ื—ืจ ื™ื•ืชืจ. ื›ืฉื ื™ืกื™ืชื™ ืœืžืฆื•ื ื™ื™ืฉื•ื ื˜ื•ื‘ ื™ื•ืชืจ, ื’ื™ืœื™ืชื™ ืฉื”ื’ืจืกื” ื”ืœื-INLINE ื”ื™ื™ืชื” ืื™ื˜ื™ืช ื™ื•ืชืจ ื‘ื›ืžื” ื’ืจืคื™ื. ื‘ื”ืชื—ืฉื‘ ื‘ื›ืš ืฉืžื‘ื—ื™ื ื” ืกืžื ื˜ื™ืช ื”ืคื•ื ืงืฆื™ื•ืช ืฆืจื™ื›ื•ืช ืœืขื‘ื•ื“ ืื•ืชื• ื”ื“ื‘ืจ, ื–ื” ืžืื•ื“ ื”ืคืชื™ืข ืื•ืชื™. ืืคื™ืœื• ืžื•ื–ืจ ื™ื•ืชืจ, ื‘ืžื›ื•ื ื” ืื—ืจืช ืขื ื’ืจืกื” ืื—ืจืช ืฉืœ GHC ืœื ื”ื™ื” ื”ื‘ื“ืœ ื ื™ื›ืจ.

ืœืื—ืจ ืฉื‘ื™ืœื™ืชื™ ืฉื‘ื•ืข ื‘ืงืจื™ืืช ืคืœื˜ GHC Core, ื”ืฆืœื—ืชื™ ืœืชืงืŸ ืืช ื”ื‘ืขื™ื” ืขื ืฉื•ืจื” ืื—ืช ืฉืœ INLINE ืžืคื•ืจืฉืช. ื‘ืฉืœื‘ ืžืกื•ื™ื ื‘ื™ืŸ GHC 8.4.4 ืœ-GHC 8.6.5 ื”ืื•ืคื˜ื™ืžื™ื–ืจ ื”ืคืกื™ืง ืœืขืฉื•ืช ื–ืืช ื‘ืขืฆืžื•.

ืœื ืฆื™ืคื™ืชื™ ืœื”ื™ืชืงืœ ื‘ืœื›ืœื•ืš ื›ื–ื” ื‘ืชื›ื ื•ืช Haskell. ืขื ื–ืืช, ื’ื ื”ื™ื•ื, ืžื˜ืขืžื™ ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืœืคืขืžื™ื ืขื•ืฉื™ื ื˜ืขื•ื™ื•ืช, ื•ืชืคืงื™ื“ื ื• ืœืชืช ืœื”ื ืจืžื–ื™ื. ืœื“ื•ื’ืžื, ื›ืืŸ ืื ื• ื™ื•ื“ืขื™ื ืฉื”ืคื•ื ืงืฆื™ื” ืฆืจื™ื›ื” ืœื”ื™ื•ืช ืžื•ื˜ื‘ืขืช ืžื›ื™ื•ื•ืŸ ืฉื”ื™ื ืžื•ื˜ื‘ืขืช ื‘ื’ืจืกืช ื”ืฆื™ื•ื•ื™, ื•ื–ื• ืกื™ื‘ื” ืœืชืช ืจืžื– ืœืžื”ื“ืจ.

ืžื” ืงืจื” ืื—ืจ ื›ืš?

ื•ืื– ื™ื™ืฉืžืชื™ ืืช ื”ืืœื’ื•ืจื™ืชื ืฉืœ ื”ื•ืคืงืจื•ืคื˜-ืงืืจืค ืขื ืžื•ื ืื•ืช ืื—ืจื•ืช, ื•ื–ื” ื”ื™ื” ืกื•ืฃ ื”ืชื•ื›ื ื™ืช.

ื”ื•ื“ื•ืช ืœ-Google Summer of Code, ืจื›ืฉืชื™ ื ื™ืกื™ื•ืŸ ืžืขืฉื™ ื‘ืชื›ื ื•ืช ืคื•ื ืงืฆื™ื•ื ืœื™, ืฉืœื ืจืง ืขื–ืจ ืœื™ ืœืงื‘ืœ ื”ืชืžื—ื•ืช ื‘ื’'ื™ื™ืŸ ืกื˜ืจื™ื˜ ื‘ืงื™ืฅ ืฉืœืื—ืจ ืžื›ืŸ (ืื ื™ ืœื ื‘ื˜ื•ื— ืขื“ ื›ืžื” ื”ืžืงื•ื ื”ื–ื” ืžื•ื›ืจ ืืคื™ืœื• ื‘ืงืจื‘ ื”ืงื”ืœ ื”ื‘ืงื™ื ืฉืœ ื”ืื‘ืจ, ืื‘ืœ ื–ื” ืื—ื“ ืžื”ื‘ื•ื“ื“ื™ื ืฉื‘ื”ื ืืชื” ื™ื›ื•ืœ ืœืงื™ืฅ ืœืขืกื•ืง ื‘ืชื›ื ื•ืช ืคื•ื ืงืฆื™ื•ื ืœื™), ืื‘ืœ ื’ื ื”ื›ื™ืจ ืœื™ ืืช ื”ืขื•ืœื ื”ืžื•ืคืœื ืฉืœ ื™ื™ืฉื•ื ื”ืคืจื“ื™ื’ืžื” ื”ื–ื• ื‘ืคื•ืขืœ, ืฉื•ื ื” ื‘ืื•ืคืŸ ืžืฉืžืขื•ืชื™ ืžื”ื ื™ืกื™ื•ืŸ ืฉืœื™ ื‘ืฉืคื•ืช ืžืกื•ืจืชื™ื•ืช.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”