GSoC 2019: ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ ื’ืจืึทืคืก ืคึฟืึทืจ ื‘ื™ื™ืคึผืึทืจื˜ื™ื˜ืขื ืขืกืก ืื•ืŸ ืžืึธื ืึทื“ ื˜ืจืึทื ืกืคืึธืจืžืขืจืก

ืœืขืฆื˜ืข ื–ื•ืžืขืจ ืื™ืš ื’ืขื ื•ืžืขืŸ ืึธื ื˜ื™ื™ืœ ืื™ืŸ Google Summer of Code - ืึท ืคึผืจืึธื’ืจืึทื ืคึฟืึทืจ ืกื˜ื•ื“ืขื ื˜ืŸ ืคึฟื•ืŸ Google. ื™ืขื“ืขืจ ื™ืึธืจ, ื“ื™ ืึธืจื’ืึทื ื™ื™ื–ืขืจื– ืื•ื™ืกืงืœื™ื™ึทื‘ืŸ ืขื˜ืœืขื›ืข ืขืคึฟืŸ ืžืงื•ืจ ืคึผืจืึทื“ื–ืฉืขืงืก, ืึทืจื™ื™ึทื ื’ืขืจืขื›ื ื˜ ืคื•ืŸ ืึทื–ืึท ื‘ืึทื•ื•ื•ืกื˜ ืึธืจื’ืึทื ื™ื–ืึทืฆื™ืขืก ื•ื•ื™ Boost.org ะธ ื“ื™ ืœื™ื ื•ืงืก ื•ื•ื™ืงื™ืคึผืขื“ื™ืข. Google ื™ื ื•ื•ื™ื™ืฅ ืกื˜ื•ื“ืขื ื˜ืŸ ืคื•ืŸ ืึทืœืข ืื™ื‘ืขืจ ื“ื™ ื•ื•ืขืœื˜ ืฆื• ืึทืจื‘ืขื˜ืŸ ืื•ื™ืฃ ื“ื™ ืคึผืจืึทื“ื–ืฉืขืงืก. 

ื•ื•ื™ ืึท ื‘ืึทื˜ื™ื™ืœื™ืงื˜ืขืจ ืื™ืŸ Google Summer of Code 2019, ืื™ืš ื“ื•ืจื›ื’ืขืงืึธื›ื˜ ืึท ืคึผืจื•ื™ืขืงื˜ ืื™ืŸ ื“ืขืจ ื‘ื™ื‘ืœื™ืึธื˜ืขืง ืึทืœื’ืึท ืžื™ื˜ ื“ืขืจ ืึธืจื’ืึทื ื™ื–ืึทืฆื™ืข Haskell.org, ื•ื•ืึธืก ืื™ื– ื“ืขื•ื•ืขืœืึธืคึผื™ื ื’ ื“ื™ Haskell ืฉืคึผืจืึทืš - ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืžืขืจืกื˜ ื‘ืึทืจื™ืžื˜ ืคืึทื ื’ืงืฉืึทื ืึทืœ ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ืฉืคึผืจืึทื›ืŸ. ืึทืœื’ืึท ืื™ื– ืึท ื‘ื™ื‘ืœื™ืึธื˜ืขืง ื•ื•ืึธืก ืจืขืคึผืจืึทื–ืขื ืฅ ื˜ื™ืคึผ ื–ื™ื›ืขืจ ืคืึทืจื˜ืจืขื˜ื•ื ื’ ืคึฟืึทืจ ื’ืจืึทืคืก ืื™ืŸ Haskell. ืขืก ืื™ื– ื’ืขื ื™ืฆื˜, ืœืžืฉืœ, ืื™ืŸ ืกืขืžืึทื ื˜ื™ืง - ืึท ื’ื™ื˜ื”ื•ื‘ ื‘ื™ื‘ืœื™ืึธื˜ืขืง ื•ื•ืึธืก ื‘ื•ื™ืขืŸ ืกืขืžืึทื ื˜ื™ืง ื‘ื™ื™ืžืขืจ, ืจื•ืคืŸ ืื•ืŸ ื“ืขืคึผืขื ื“ืขื ืกื™ ื’ืจืึทืคืก ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ืงืึธื“ ืื•ืŸ ืงืขื ืขืŸ ืคืึทืจื’ืœื™ื™ึทื›ืŸ ื–ื™ื™. ืžื™ื™ึทืŸ ืคึผืจื•ื™ืขืงื˜ ืื™ื– ื’ืขื•ื•ืขืŸ ืฆื• ืœื™ื™ื’ืŸ ืึท ื˜ื™ืคึผ-ื–ื™ื›ืขืจ ืคืึทืจื˜ืจืขื˜ื•ื ื’ ืคึฟืึทืจ ื‘ื™ื™ืคึผืึทืจื˜ื™ื˜ืข ื’ืจืึทืคืก ืื•ืŸ ืึทืœื’ืขืจื™ื“ืึทืžื– ืคึฟืึทืจ ืึทื– ืคืึทืจื˜ืจืขื˜ื•ื ื’. 

ืื™ืŸ ื“ืขื ืคึผืึธืกื˜ืŸ ืื™ืš ื•ื•ืขืœ ืจืขื“ืŸ ื•ื•ืขื’ืŸ ืžื™ื™ืŸ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ืึท ืึทืœื’ืขืจื™ื“ืึทื ืคึฟืึทืจ ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ ืึท ื’ืจืึทืคื™ืง ืคึฟืึทืจ ื‘ื™ื™ืคึผืึทืจื˜ื™ื˜ืขื ืขืกืก ืื™ืŸ Haskell. ืืคื™ืœื• ื›ืึธื˜ืฉ ื“ื™ ืึทืœื’ืขืจื™ื“ืึทื ืื™ื– ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืžืขืจืกื˜ ื™ืงืขืจื“ื™ืง, ื™ืžืคึผืœืึทืžืขื ื™ื ื’ ืขืก ื‘ื™ื•ื˜ืึทืคืœื™ ืื™ืŸ ืึท ืคืึทื ื’ืงืฉืึทื ืึทืœ ื ื•ืกื— ื”ืื˜ ืžื™ืจ ืขื˜ืœืขื›ืข ื™ื˜ืขืจื™ื™ืฉืึทื ื– ืื•ืŸ ืคืืจืœืื ื’ื˜ ื’ืึทื ืฅ ืึท ืคึผืœืึทืฅ ืคื•ืŸ ืึทืจื‘ืขื˜. ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ืื™ืš ื’ืขื–ืขืฆื˜ ืื•ื™ืฃ ืึท ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืžื™ื˜ ืžืึธื ืึทื“ ื˜ืจืึทื ืกืคืึธืจืžืขืจืก. 

GSoC 2019: ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ ื’ืจืึทืคืก ืคึฟืึทืจ ื‘ื™ื™ืคึผืึทืจื˜ื™ื˜ืขื ืขืกืก ืื•ืŸ ืžืึธื ืึทื“ ื˜ืจืึทื ืกืคืึธืจืžืขืจืก

ื•ื•ืขื’ืŸ ื–ื™ืš

ืžื™ื™ืŸ ื ืึธืžืขืŸ ืื™ื– ื•ื•ืึทืกื™ืœื™ ืึทืœืคืขืจืึธื•ื•, ืื™ืš ื‘ื™ืŸ ืึท ืคืขืจื˜-ื™ืึธืจ ืชึผืœืžื™ื“ ืื™ืŸ ืกื˜ ืคืขื˜ืขืจื‘ื•ืจื’ ื”ืกืข. ืคืจื™ืขืจ ืื™ืŸ ื“ืขื ื‘ืœืึธื’ ืื™ืš ื’ืขืฉืจื™ื‘ืŸ ื•ื•ืขื’ืŸ ืžื™ื™ืŸ ืคึผืจื•ื™ืขืงื˜ ื•ื•ืขื’ืŸ ืคึผืึทืจืึทืžืขื˜ืขืจื™ื™ื–ื“ ืึทืœื’ืขืจื™ื“ืึทืžื– ะธ ื•ื•ืขื’ืŸ ื“ืขืจ ื™ืึทื–ื“ืข ืฆื• ZuriHac. ืจืขื›ื˜ ืื™ืฆื˜ ืื™ืš ื‘ื™ืŸ ืื•ื™ืฃ ืึท ื™ื ื˜ืขืจื ืฉื™ืคึผ ืื™ืŸ ืื•ื ื™ื•ื•ืขืจืกื™ื˜ืขื˜ ืคื•ืŸ ื‘ืขืจื’ืขืŸ ืื™ืŸ ื ืึธืจื•ื•ื™ื™ึท, ื•ื•ื• ืื™ืš ืึทืจื‘ืขื˜ ืื•ื™ืฃ ืึทืคึผืจืึธื•ื˜ืฉื™ื– ืฆื• ื“ืขื ืคึผืจืึธื‘ืœืขื ืจืฉื™ืžื” ืงืึธืœืึธืจื™ื ื’. ืžื™ื™ึทืŸ ืื™ื ื˜ืขืจืขืกืŸ ืึทืจื™ื™ึทื ื ืขืžืขืŸ ืคึผืึทืจืึทืžืขื˜ืขืจื™ื™ื–ื“ ืึทืœื’ืขืจื™ื“ืึทืžื– ืื•ืŸ ืคืึทื ื’ืงืฉืึทื ืึทืœ ืคึผืจืึธื’ืจืึทืžืžื™ื ื’.

ื•ื•ืขื’ืŸ ื“ื™ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ ืึทืœื’ืขืจื™ื“ืึทื

ื”ืึทื’ื“ืึธืžืข

ืกื˜ื•ื“ืขื ื˜ืŸ ื•ื•ืึธืก ืึธื ื˜ื™ื™ืœ ื ืขืžืขืŸ ืื™ืŸ ื“ืขื ืคึผืจืึธื’ืจืึทื ื–ืขื ืขืŸ ืฉื˜ืืจืง ื™ื ืงืขืจืึทื“ื–ืฉื“ ืฆื• ื‘ืœืึธื’. ื–ื™ื™ ื”ืึธื‘ืŸ ืžื™ืจ ืฆื•ื’ืขืฉื˜ืขืœื˜ ืึท ืคึผืœืึทื˜ืคืึธืจืžืข ืคึฟืึทืจ ื“ืขื ื‘ืœืึธื’ ื–ื•ืžืขืจ ืคื•ืŸ ื”ืึทืกืงืขืœืœ. ื“ืขืจ ืึทืจื˜ื™ืงืœ ืื™ื– ืึทืŸ ืื™ื‘ืขืจื–ืขืฆื•ื ื’ ืึทืจื˜ื™ืงืœ, ื’ืขืฉืจื™ื‘ืŸ ื“ื•ืจืš ืžื™ืจ ื“ืึธืจื˜ ืื™ืŸ ื™ื•ืœื™ ืื™ืŸ ืขื ื’ืœื™ืฉ, ืžื™ื˜ ืึท ืงื•ืจืฅ ื”ืงื“ืžื”. 

ืฆื™ืขืŸ ื‘ืขื˜ืŸ ืžื™ื˜ ื“ื™ ืงืึธื“ ืื™ืŸ ืงืฉื™ื ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ ื“ืึธ.

ืื™ืจ ืงืขื ื˜ ืœื™ื™ืขื ืขืŸ ื•ื•ืขื’ืŸ ื“ื™ ืจืขื–ื•ืœื˜ืึทื˜ืŸ ืคื•ืŸ ืžื™ื™ืŸ ืึทืจื‘ืขื˜ (ืื™ืŸ ืขื ื’ืœื™ืฉ) ื“ืึธ.

ื“ืขืจ ืคึผืึธืกื˜ืŸ ืึทืกื•ืžื– ืึทื– ื“ืขืจ ืœื™ื™ืขื ืขืจ ืื™ื– ื‘ืึทืงืึทื ื˜ ืžื™ื˜ ื“ื™ ื’ืจื•ื ื˜ ืงืึทื ืกืขืคึผืก ืื™ืŸ ืคืึทื ื’ืงืฉืึทื ืึทืœ ืคึผืจืึธื’ืจืึทืžืžื™ื ื’, ื›ืึธื˜ืฉ ืื™ืš ื•ื•ืขืœ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืฆื•ืจื™ืงืจื•ืคืŸ ืึทืœืข ื“ื™ ื˜ืขืจืžื™ื ืขืŸ ื’ืขื ื™ืฆื˜ ื•ื•ืขืŸ ื“ื™ ืฆื™ื™ื˜ ืงื•ืžื˜.

ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ ื’ืจืึทืคืก ืคึฟืึทืจ ื‘ื™ื™ืคึผืึทืจื˜ื™ื˜ืขื ืขืกืก 

ืึทืŸ ืึทืœื’ืขืจื™ื“ืึทื ืคึฟืึทืจ ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ ืึท ื’ืจืึทืคื™ืง ืคึฟืึทืจ ื‘ื™ื™ืคึผืึทืจื˜ื™ื˜ืขื ืขืกืก ืื™ื– ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ื’ืขื’ืขื‘ืŸ ืื™ืŸ ืึท ืงื•ืจืก ืื•ื™ืฃ ืึทืœื’ืขืจื™ื“ืึทืžื– ื•ื•ื™ ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืกื™ืžืคึผืœืึทืกื˜ ื’ืจืึทืคื™ืง ืึทืœื’ืขืจื™ื“ืึทืžื–. ื–ื™ื™ืŸ ื’ืขื“ืึทื ืง ืื™ื– ืกื˜ืจื™ื™ื˜ืคืึธืจื•ื•ืขืจื“: ืขืจืฉื˜ืขืจ ืžื™ืจ ืขืคืขืก ืฉื˜ืขืœืŸ ื•ื•ืขืจื˜ื™ืกืขืก ืื™ืŸ ื“ื™ ืœื™ื ืงืก ืึธื“ืขืจ ืจืขื›ื˜ ื˜ื™ื™ืœืŸ, ืื•ืŸ ื•ื•ืขืŸ ืึท ืงืึทื ืคืœื™ืงื˜ื™ื ื’ ื‘ืจืขื’ ืื™ื– ื’ืขืคึฟื•ื ืขืŸ, ืžื™ืจ ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ืึทื– ื“ื™ ื’ืจืึทืคื™ืง ืื™ื– ื ื™ืฉื˜ ื‘ื™ื™ืคึผืึทืจื˜ื™ื˜.

ื ื‘ื™ืกืœ ืžืขืจ ื“ืขื˜ืึทืœ: ืขืจืฉื˜ืขืจ ืžื™ืจ ืฉื˜ืขืœืŸ ืขื˜ืœืขื›ืข ื•ื•ืขืจื˜ืขืงืก ืื™ืŸ ื“ื™ ืœื™ื ืงืก ื˜ื™ื™ืœืŸ. ื“ืึธืš, ืึทืœืข ื“ื™ ืฉื›ื ื™ื ืคื•ืŸ ื“ืขื ื•ื•ืขืจื˜ืขืงืก ืžื•ื–ืŸ ืœื™ื’ืŸ ืื™ืŸ ื“ื™ ืจืขื›ื˜ ืœืึธื•ื‘. ืฐืฒื˜ืข ืจ ื“ืืจืค ืŸ ื–ื™ ืš ืืœ ืข ืฉื›ื ื™ ื ืคื• ืŸ ื“ ื™ ืฉื›ื ื™ ื ืคื• ืŸ ื“ืข ื ื“ืื–ื™ืง ืŸ ืฐื™ืจื˜ืงืก , ืœื™ื’ ืŸ ืื™ ืŸ ื“ืข ืจ ืœื™ื ืงืข ืจ ืœืื‘ ืข ืื• ืŸ ืื–ื• ื™ ืฐืฒื˜ืขืจ . ืžื™ืจ ืคืึธืจื–ืขืฆืŸ ืฆื• ื‘ืึทืฉื˜ื™ืžืขืŸ ืฉืึทืจืขืก ืฆื• ื•ื•ืขืจื˜ื™ืกืขืก ืึทื–ื•ื™ ืœืึทื ื’ ื•ื•ื™ ืขืก ื–ืขื ืขืŸ ื ืึธืš ื•ื•ืขืจื˜ื™ืงืึทืœื– ืื™ืŸ ื“ื™ ืคืืจื‘ื•ื ื“ืŸ ืงืึธืžืคึผืึธื ืขื ื˜ ืคื•ืŸ ื“ื™ ื•ื•ืขืจื˜ืขืงืก ืžื™ื˜ ื•ื•ืึธืก ืžื™ืจ ื”ืึธื‘ืŸ ื ื™ืฉื˜ ืึทืกื™ื™ื ื“ ืฉื›ื ื™ื. ืžื™ืจ ื“ืขืžืึธืœื˜ ืื™ื‘ืขืจื—ื–ืจืŸ ื“ืขื ืงืึทืžืฃ ืคึฟืึทืจ ืึทืœืข ืคืืจื‘ื•ื ื“ืŸ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ.

ืื•ื™ื‘ ืขืก ืื™ื– ืึท ื‘ืจืขื’ ืฆื•ื•ื™ืฉืŸ ื•ื•ืขืจื˜ื™ืงืก ื•ื•ืึธืก ืคืึทืœืŸ ืื™ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืฆืขื˜ื™ื™ืœื•ื ื’, ืขืก ืื™ื– ื ื™ืฉื˜ ืฉื•ื•ืขืจ ืฆื• ื’ืขืคึฟื™ื ืขืŸ ืึท ืžืึธื“ื ืข ืฆื™ืงืœ ืื™ืŸ ื“ื™ ื’ืจืึทืคื™ืง, ื•ื•ืึธืก ืื™ื– ื‘ืจื™ื™ื˜ ื‘ืืงืื ื˜ (ืื•ืŸ ื’ืึทื ืฅ ื“ืึธืš) ืื•ืžืžืขื’ืœืขืš ืื™ืŸ ืึท ืฆื•ื•ื™ื™ืคึผืึทืจื˜ื™ื™ื˜ ื’ืจืึทืคื™ืง. ืึทื ื“ืขืจืฉ, ืžื™ืจ ื”ืึธื‘ืŸ ืึท ืจื™ื›ื˜ื™ืง ืฆืขื˜ื™ื™ืœื•ื ื’, ื•ื•ืึธืก ืžื™ื˜ืœ ื“ื™ ื’ืจืึทืคื™ืง ืื™ื– ื‘ื™ื™ืคึผืึทืจื˜ื™ื˜ืข.

ื˜ื™ืคึผื™ืงืึทืœืœื™, ื“ืขื ืึทืœื’ืขืจื™ื“ืึทื ืื™ื– ื™ืžืคึผืœืึทืžืขื ืึทื“ ื ื™ืฆืŸ ื‘ืจื™ื™ื˜ ืขืจืฉื˜ืขืจ ื–ื•ื›ืŸ ืึธื“ืขืจ ื˜ื™ืฃ ืขืจืฉื˜ืขืจ ื–ื•ื›ืŸ. ืื™ืŸ ื™ืžืคึผืขืจืึทื˜ื™ื•ื• ืฉืคึผืจืึทื›ืŸ, ื˜ื™ืฃ-ืขืจืฉื˜ืขืจ ื–ื•ื›ืŸ ืื™ื– ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ื’ืขื ื™ืฆื˜ ื•ื•ื™ื™ึทืœ ืขืก ืื™ื– ืึท ื‘ื™ืกืœ ืกื™ืžืคึผืœืขืจ ืื•ืŸ ื˜ื•ื˜ ื ื™ืฉื˜ ื“ืึทืจืคืŸ ื ืึธืš ื“ืึทื˜ืŸ ืกื˜ืจืึทืงื˜ืฉืขืจื–. ืื™ืš ืื•ื™ืš ืื•ื™ืกื“ืขืจื•ื•ื™ื™ืœื˜ ื˜ื™ืฃ-ืขืจืฉื˜ืขืจ ื–ื•ื›ืŸ ื•ื•ื™ื™ึทืœ ืขืก ืื™ื– ืžืขืจ ื˜ืจืื“ื™ืฆื™ืื ืขืœืŸ.

ืื–ื• ื™ ื–ืขื ืข ืŸ ืžื™ ืจ ื’ืขืงื•ืžืข ืŸ ืฆ ื• ื“ืข ืจ ืคืืœื’ื ื“ื™ืงืข ืจ ืกื›ืขืžืข . ืžื™ืจ ื“ื•ืจื›ืคืึธืจ ื“ื™ ื•ื•ืขืจื˜ื™ืกืขืก ืคื•ืŸ ื“ื™ ื’ืจืึทืคื™ืง ื ื™ืฆืŸ ื“ื™ ืขืจืฉื˜ืขืจ ื–ื•ื›ืŸ ืื•ืŸ ื‘ืึทืฉื˜ื™ืžืขืŸ ืฉืึทืจืขืก ืฆื• ื–ื™ื™, ื˜ืฉืึทื ื’ื™ื ื’ ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ื“ื™ ื˜ื™ื™ืœืŸ ื•ื•ืขืŸ ืžื™ืจ ืžืึทืš ืื•ื™ืฃ ื“ืขื ื‘ืจืขื’. ืื•ื™ื‘ ืžื™ืจ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ื‘ืึทืฉื˜ื™ืžืขืŸ ืึท ืฉืขืจ ืฆื• ืึท ื•ื•ืขืจื˜ืขืงืก ื•ื•ืึธืก ืฉื•ื™ืŸ ื”ืื˜ ืึท ื˜ื™ื™ืœืŸ ืึทืกื™ื™ื ื“, ืžื™ืจ ืงืขื ืขืŸ ื‘ืขืฉืึธืœืขื ื–ืึธื’ืŸ ืึทื– ื“ื™ ื’ืจืึทืคื™ืง ืื™ื– ื ื™ืฉื˜ ื‘ื™ื™ืคึผืึทืจื˜ื™ื˜. ื“ืขืจ ืžืึธืžืขื ื˜ ื•ื•ืขืŸ ืึทืœืข ื•ื•ืขืจื˜ื™ืกืขืก ื–ืขื ืขืŸ ืึทืกื™ื™ื ื“ ืึท ื˜ื™ื™ืœืŸ ืื•ืŸ ืžื™ืจ ื”ืึธื‘ืŸ ื’ืขืงื•ืงื˜ ืื•ื™ืฃ ืึทืœืข ื“ื™ ืขื“ื–ืฉืึทื–, ืžื™ืจ ื”ืึธื‘ืŸ ืึท ื’ื•ื˜ ืฆืขื˜ื™ื™ืœื•ื ื’.

ืจื™ื™ื ืงื™ื™ึทื˜ ืคื•ืŸ ื—ืฉื‘ื•ื ื•ืช

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

ืžืึธื ืึทื“ืก ื–ืขื ืขืŸ ืึท ื•ื•ืขื’ ืฆื• ืคืึธืจืฉื˜ืขืœืŸ ื—ืฉื‘ื•ื ื•ืช ืžื™ื˜ ื•ื•ื™ืจืงื•ื ื’ ืื™ืŸ ื”ืืกืงืขืœ. ื“ืขืจืงืœืขืจืŸ ื•ื•ื™ ื–ื™ื™ ืึทืจื‘ืขื˜ ืื™ื– ื•ื•ื™ื™ึทื˜ืขืจ ืคื•ืŸ ื“ืขื ืคืึทืจื ืขื ืคื•ืŸ ื“ืขื ืคึผืึธืกื˜ืŸ. ื ื’ื•ื˜ืข ืื•ืŸ ืงืœืืจืข ื‘ืืฉืจื™ื™ื‘ื•ื ื’ ืงืขืŸ ืžืขืŸ ืœื™ื™ืขื ืขืŸ ืื•ื™ืฃ ืขื ื’ืœื™ืฉ ื“ืึธ.

ื“ืึธ ืื™ืš ื•ื•ื™ืœืŸ ืฆื• ืคื•ื ื˜ ืื•ื™ืก ืึทื– ื‘ืฉืขืช ืขื˜ืœืขื›ืข ืžืึธื ืึทื“ืก, ืึทื–ืึท ื•ื•ื™ ื™ืึธ, ื–ืขื ืขืŸ ื™ืžืคึผืœืึทืžืขื ืึทื“ ื“ื•ืจืš ืงืึทืžืคึผื™ื™ืœืขืจ ืžืึทื’ื™ืฉ, ื›ึผืžืขื˜ ืึทืœืข ืื ื“ืขืจืข ื–ืขื ืขืŸ ื™ืžืคึผืœืึทืžืขื ืึทื“ ืื™ืŸ ื•ื•ื™ื™ื›ื•ื•ืืจื’ ืื•ืŸ ืึทืœืข ื—ืฉื‘ื•ื ื•ืช ืื™ืŸ ื–ื™ื™ ื–ืขื ืขืŸ ืจื™ื™ืŸ.

ืขืก ื–ืขื ืขืŸ ืคื™ืœืข ื™ืคืขืงืฅ ืื•ืŸ ื™ืขื“ืขืจ ื”ืื˜ ื–ื™ื™ืŸ ืื™ื™ื’ืขื ืข ืžืึธื ืึทื“. ื“ืึธืก ืื™ื– ืึท ื–ื™ื™ืขืจ ืฉื˜ืึทืจืง ืื•ืŸ ืฉื™ื™ืŸ ื˜ืขืึธืจื™ืข: ืึทืœืข ืžืึธื ืึทื“ืก ื™ื ืกื˜ืจื•ืžืขื ื˜ ื“ื™ ื–ืขืœื‘ืข ืฆื•ื‘ื™ื ื“. ืžื™ืจ ื•ื•ืขืœืŸ ืจืขื“ืŸ ื•ื•ืขื’ืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ื“ืจื™ื™ ืžืึธื ืึทื“ืก:

  • ืึธื“ืขืจ ea ืื™ื– ืึท ื›ืขื–ืฉื‘ืŸ ื•ื•ืึธืก ืงืขืจื˜ ืึท ื•ื•ืขืจื˜ ืคื•ืŸ ื˜ื™ืคึผ ืึท ืึธื“ืขืจ ื•ื•ืึทืจืคืŸ ืึท ื•ื™ืกื ืขื ืคื•ืŸ ื˜ื™ืคึผ e. ื“ื™ ื ืึทื˜ื•ืจ ืคื•ืŸ ื“ืขื ืžืึธื ืึทื“ ืื™ื– ื–ื™ื™ืขืจ ืขื ืœืขืš ืฆื• ื•ื™ืกื ืขื ื”ืึทื ื“ืœื™ื ื’ ืื™ืŸ ื™ืžืคึผืขืจืึทื˜ื™ื•ื• ืฉืคึผืจืึทื›ืŸ: ืขืจืจืึธืจืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื›ืืคื˜ ืึธื“ืขืจ ื“ื•ืจื›ื’ืขื’ืื ื’ืขืŸ ืื•ื™ืฃ. ื“ืขืจ ื”ื•ื™ืคึผื˜ ื—ื™ืœื•ืง ืื™ื– ืึทื– ื“ื™ ืžืึธื ืึทื“ ืื™ื– ื’ืึธืจ ืœืึทื“ื–ืฉื™ืงืœื™ ื™ืžืคึผืœืึทืžืขื ืึทื“ ืื™ืŸ ื“ื™ ืกื˜ืึทื ื“ืึทืจื˜ ื‘ื™ื‘ืœื™ืึธื˜ืขืง ืื™ืŸ Haskell, ื‘ืฉืขืช ื™ืžืคึผืขืจืึทื˜ื™ื•ื• ืฉืคึผืจืึทื›ืŸ ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ื ื•ืฆืŸ ืึธืคึผืขืจื™ื™ื˜ื™ื ื’ ืกื™ืกื˜ืขื ืžืขืงืึทื ื™ื–ืึทืžื–.
  • ืฉื˜ืึทื˜ ืกืึท ืื™ื– ืึท ื›ืขื–ืฉื‘ืŸ ื•ื•ืึธืก ืงืขืจื˜ ืึท ื•ื•ืขืจื˜ ืคื•ืŸ ื˜ื™ืคึผ ืึท ืื•ืŸ ื”ืื˜ ืึทืงืกืขืก ืฆื• ืžื™ื•ื˜ืึทื‘ืึทืœ ืฉื˜ืึทื˜ ืคื•ืŸ ื˜ื™ืคึผ s.
  • ืืคืฉืจ ื. ื“ืขืจ ืžื™ื™ึทื‘ืข ืžืึธื ืึทื“ ื™ืงืกืคึผืจืขืกืึทื– ืึท ืงืึทืžืคึผื™ืึทื˜ื™ื™ืฉืึทืŸ ื•ื•ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื™ื ื˜ืขืจืึทืคึผื˜ื™ื“ ืื™ืŸ ืงื™ื™ืŸ ืฆื™ื™ื˜ ื“ื•ืจืš ืฆื•ืจื™ืงืงื•ืžืขืŸ ื’ืึธืจื ื™ืฉื˜. ืึธื‘ืขืจ, ืžื™ืจ ื•ื•ืขืœืŸ ืจืขื“ืŸ ื•ื•ืขื’ืŸ ื“ื™ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ MonadPlus ืงืœืึทืก ืคึฟืึทืจ ื“ื™ ืืคึฟืฉืจ ื˜ื™ืคึผ, ื•ื•ืึธืก ื™ืงืกืคึผืจืขืกืึทื– ื“ื™ ืคืึทืจืงืขืจื˜ ื•ื•ื™ืจืงื•ื ื’: ืขืก ืื™ื– ืึท ื›ืขื–ืฉื‘ืŸ ื•ื•ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื™ื ื˜ืขืจืึทืคึผื˜ื™ื“ ืื™ืŸ ืงื™ื™ืŸ ืฆื™ื™ื˜ ื“ื•ืจืš ืฆื•ืจื™ืงืงื•ืžืขืŸ ืึท ืกืคึผืขืฆื™ืคื™ืฉ ื•ื•ืขืจื˜.

ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ ืึทืœื’ืขืจื™ื“ืึทื

ืžื™ืจ ื”ืึธื‘ืŸ ืฆื•ื•ื™ื™ ื“ืึทื˜ืŸ ื˜ื™ื™ืคึผืก, Graph a ืื•ืŸ Bigraph ab, ื“ืขืจ ืขืจืฉื˜ืขืจ ืคื•ืŸ ื•ื•ืึธืก ืจืขืคึผืจืึทื–ืขื ืฅ ื’ืจืึทืคืก ืžื™ื˜ ื•ื•ืขืจื˜ื™ืกืขืก ืœื™ื™ื‘ืึทืœื“ ืžื™ื˜ ื•ื•ืึทืœื•ืขืก ืคื•ืŸ ื˜ื™ืคึผ ืึท, ืื•ืŸ ื“ื™ ืจื’ืข ืจืขืคึผืจืึทื–ืขื ืฅ ื‘ื™ื™ืคึผืึทืจื˜ื™ื˜ืข ื’ืจืึทืคืก ืžื™ื˜ ืœื™ื ืงืก-ื–ื™ื™ึทื˜ ื•ื•ืขืจื˜ื™ืกืขืก ืœื™ื™ื‘ืึทืœื“ ืžื™ื˜ ื•ื•ืึทืœื•ืขืก ืคื•ืŸ ื˜ื™ืคึผ ืึท ืื•ืŸ ืจืขื›ื˜. -ื–ื™ื™ึทื˜ ื•ื•ืขืจื˜ื™ืกืขืก ืœื™ื™ื‘ืึทืœื“ ืžื™ื˜ ื•ื•ืึทืœื•ืขืก ืคื•ืŸ ื˜ื™ืคึผ ื‘.

ื“ืึธืก ื–ืขื ืขืŸ ื ื™ืฉื˜ ื˜ื™ื™ืคึผืก ืคื•ืŸ ื“ื™ ืึทืœื’ืึท ื‘ื™ื‘ืœื™ืึธื˜ืขืง. ืึทืœื’ืึท ื˜ื•ื˜ ื ื™ืฉื˜ ื”ืึธื‘ืŸ ืึท ืคืึทืจื˜ืจืขื˜ื•ื ื’ ืคึฟืึทืจ ืึทื ืจืขืงื˜ื™ื“ ื‘ื™ื™ืคึผืึทืจื˜ื™ื˜ืข ื’ืจืึทืคืก. ืื™ืš ื’ืขืžืื›ื˜ ื“ื™ ื˜ื™ื™ืคึผืก ื•ื•ื™ ื“ืขื ืคึฟืึทืจ ืงืœืขืจื™ื˜ื™.

ืžื™ืจ ื•ื•ืขืœืŸ ืื•ื™ืš ื“ืึทืจืคึฟืŸ ื”ืขืœืคึผืขืจ ืคืึทื ื’ืงืฉืึทื ื– ืžื™ื˜ ื“ื™ ืคืืœื’ืขื ื“ืข ืกื™ื’ื ืึทื˜ืฉืขืจื–:

-- ะกะฟะธัะพะบ ัะพัะตะดะตะน ะดะฐะฝะฝะพะน ะฒะตั€ัˆะธะฝั‹.
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 ืงืœืึทืก ืคื•ืŸ ื“ื™ ืžืึธื ืึทื“ ื•ื•ืึธืก ืžื™ืจ ื”ืึธื‘ืŸ ืื•ื™ืกื“ืขืจื•ื•ื™ื™ืœื˜: ืžื™ืจ ื ืึธืจ ื“ืึทืจืคึฟืŸ ืฆื• ืฉื˜ืขืœืŸ ืึทืœืข ื“ื™ ื•ื•ืขืจื˜ื™ืงืึทืœื– ืคื•ืŸ ื“ืขื ื“ืจืš ืื™ืŸ ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ืื•ืžื’ืขืงืขืจื˜ ืคึฟื•ืŸ ื“ื™ ืจืขืงื•ืจืกื™ื•ื•ืข ืคื•ื ืงืฆื™ืข.

ืžื™ื™ึทืŸ ืขืจืฉื˜ืขืจ ื’ืขื“ืึทื ืง ืื™ื– ื’ืขื•ื•ืขืŸ ืฆื• ื ื•ืฆืŸ ื“ื™ ืึธื“ืขืจ ืžืึธื ืึทื“, ื•ื•ืึธืก ืกื™ืžื– ืฆื• ื™ื ืกื˜ืจื•ืžืขื ื˜ ืคึผื•ื ืงื˜ ื“ื™ ื™ืคืขืงืฅ ื•ื•ืึธืก ืžื™ืจ ื“ืึทืจืคึฟืŸ. ื“ืขืจ ืขืจืฉื˜ืขืจ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืื™ืš ื’ืขืฉืจื™ื‘ืŸ ืื™ื– ื’ืขื•ื•ืขืŸ ื–ื™ื™ืขืจ ื ืึธืขื ื˜ ืฆื• ื“ืขื ืึธืคึผืฆื™ืข. ืื™ืŸ ืคืึทืงื˜, ืื™ืš ื’ืขื”ืื˜ ืคื™ื ืฃ ืคืึทืจืฉื™ื“ืขื ืข ื™ืžืคึผืœืึทืžืึทื ืฅ ืื™ืŸ ืื™ื™ืŸ ืคื•ื ื˜ ืื•ืŸ ื™ื•ื•ืขื ื˜ืฉืึทื•ื•ืึทืœื™ ื’ืขื–ืขืฆื˜ ืื•ื™ืฃ ืืŸ ืื ื“ืขืจ ืื™ื™ื ืขืจ.

ืขืจืฉื˜ืขืจ, ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื”ืึทืœื˜ืŸ ืึท ืึทืกืกืึธืกื™ืึทื˜ื™ื•ื•ืข ืžืขื ื’ืข ืคื•ืŸ โ€‹โ€‹ื™ื™ึทื ื˜ื™ื™ืœืŸ ื™ื“ืขื ื˜ื™ืคื™ืขืจืก - ื“ืึธืก ืื™ื– ืขืคึผืขืก ื•ื•ืขื’ืŸ ืฉื˜ืึทื˜. ืฆื•ื•ื™ื™ื˜ื ืก, ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืงืขื ืขืŸ ื”ืึทืœื˜ืŸ ื•ื•ืขืŸ ืึท ืงืึธื ืคืœื™ืงื˜ ืื™ื– ื“ื™ื˜ืขืงื˜ืึทื“. ื“ืึธืก ืงืขืŸ ื–ื™ื™ืŸ ืึธื“ืขืจ 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)

ื“ืขืจ ื•ื•ื• ื‘ืœืึธืง ืื™ื– ื“ื™ ื”ืึทืจืฅ ืคื•ืŸ ื“ื™ ืึทืœื’ืขืจื™ื“ืึทื. ืื™ืš ื•ื•ืขืœ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ื“ืขืจืงืœืขืจืŸ ื•ื•ืึธืก ืื™ื– ื’ืขืฉืขืขื ื™ืฉ ืื™ืŸ ืขืก.

  • ื™ื ื•ื•ืขืจื˜ืขืงืก ืื™ื– ื“ืขืจ ื˜ื™ื™ืœ ืคื•ืŸ ื“ืขืจ ืขืจืฉื˜ืขืจ ื˜ื™ืฃ ื–ื•ื›ืŸ ื•ื•ื• ืžื™ืจ ื‘ืึทื–ื•ื›ืŸ ื“ืขื ื•ื•ืขืจื˜ืขืงืก ืคึฟืึทืจ ื“ื™ ืขืจืฉื˜ืขืจ ืžืึธืœ. ื“ืึธ ืžื™ืจ ื‘ืึทืฉื˜ื™ืžืขืŸ ืึท ื˜ื™ื™ืœืŸ ื ื•ืžืขืจ ืฆื• ื“ื™ ื•ื•ืขืจื˜ืขืงืก ืื•ืŸ ืœื•ื™ืคืŸ onEdge ืื•ื™ืฃ ืึทืœืข ืฉื›ื ื™ื. ื“ืึธืก ืื™ื– ืื•ื™ืš ื•ื•ื• ืžื™ืจ ื•ืžืงืขืจืŸ ื“ื™ ืจื•ืคืŸ ืึธื ืœื™ื™ื’ืŸ: ืื•ื™ื‘ msum ืื•ืžื’ืขืงืขืจื˜ ืึท ื•ื•ืขืจื˜, ืžื™ืจ ืฉื˜ื•ืคึผืŸ ื•ื•ืขืจื˜ืขืงืก ื•ื• ื“ืึธืจื˜.
  • onEdge ืื™ื– ื“ืขืจ ื˜ื™ื™ืœ ื•ื•ื• ืžื™ืจ ื‘ืึทื–ื•ื›ืŸ ื“ืขื ื‘ืจืขื’. ืขืก ืื™ื– ื’ืขืจื•ืคืŸ ืฆื•ื•ื™ื™ ืžืึธืœ ืคึฟืึทืจ ื™ืขื“ืขืจ ื‘ืจืขื’. ื“ืึธ ืžื™ืจ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืื•ื™ื‘ ื“ื™ ื•ื•ืขืจื˜ืขืงืก ืื•ื™ืฃ ื“ื™ ืื ื“ืขืจืข ื–ื™ื™ึทื˜ ืื™ื– ื‘ืื–ื•ื›ื˜, ืื•ืŸ ื‘ืึทื–ื•ื›ืŸ ืขืก ืื•ื™ื‘ ื ื™ืฉื˜. ืื•ื™ื‘ ื‘ืื–ื•ื›ื˜, ืžื™ืจ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืฆื™ ื“ื™ ื‘ืจืขื’ ืื™ื– ืงืึทื ืคืœื™ืงื˜ื™ื ื’. ืื•ื™ื‘ ื“ืึธืก ืื™ื–, ืžื™ืจ ืฆื•ืจื™ืงืงื•ืžืขืŸ ื“ื™ ื•ื•ืขืจื˜ - ื“ื™ ืฉืคึผื™ืฅ ืคื•ืŸ ื“ื™ ืจืขืงื•ืจืกื™ืึธืŸ ืึธื ืœื™ื™ื’ืŸ, ื•ื•ื• ืึทืœืข ืื ื“ืขืจืข ื•ื•ืขืจื˜ื™ืกืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขืฉื˜ืขืœื˜ ืื•ื™ืฃ ืฆื•ืจื™ืงืงื•ืžืขืŸ.
  • ืคึผืจืึธืฆืขืกื•ื•ืขืจื˜ืขืงืก ื˜ืฉืขืงืก ืคึฟืึทืจ ื™ืขื“ืขืจ ื•ื•ืขืจื˜ืขืงืก ืฆื™ ืขืก ืื™ื– ื‘ืื–ื•ื›ื˜ ืื•ืŸ ืœื•ื™ืคื˜ ืื™ืŸ ื•ื•ืขืจื˜ืขืงืก ืื•ื™ืฃ ืขืก ืื•ื™ื‘ ื ื™ืฉื˜.
  • dfs ืœื•ื™ืคื˜ ืคึผืจืึธืฆืขืกื•ื•ืขืจื˜ืขืงืก ืื•ื™ืฃ ืึทืœืข ื•ื•ืขืจื˜ื™ืกืขืก.

ืึทื– ืก ืึทืœืข.

ื’ืขืฉื™ื›ื˜ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ื•ื•ืึธืจื˜ INLINE

ื“ื™ ื•ื•ืึธืจื˜ INLINE ืื™ื– ื ื™ืฉื˜ ื’ืขื•ื•ืขืŸ ืื™ืŸ ื“ืขืจ ืขืจืฉื˜ืขืจ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ ืึทืœื’ืขืจื™ื“ืึทื; ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ืฉืคึผืขื˜ืขืจ. ื•ื•ืขืŸ ืื™ืš ื’ืขืคืจื•ื•ื•ื˜ ืฆื• ื’ืขืคึฟื™ื ืขืŸ ืึท ื‘ืขืกืขืจ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ, ืื™ืš ื’ืขืคึฟื•ื ืขืŸ ืึทื– ื“ื™ ื ื™ื˜-INLINE ื•ื•ืขืจืกื™ืข ืื™ื– ื ืึธื•ื˜ื™ืกืึทื‘ืœื™ ืกืœืึธื•ืขืจ ืื•ื™ืฃ ืขื˜ืœืขื›ืข ื’ืจืึทืคืก. ืงืึทื ืกื™ื“ืขืจื™ื ื’ ืึทื– ืกืขืžืึทื ื˜ื™ืงืึทืœืœื™ ื“ื™ ืคืึทื ื’ืงืฉืึทื ื– ื–ืึธืœ ืึทืจื‘ืขื˜ืŸ ื“ื™ ื–ืขืœื‘ืข, ื“ืึธืก ื–ื™ื™ืขืจ ืกืึทืคึผืจื™ื™ื–ื“ ืžื™ืจ. ืืคื™ืœื• ืคืจืขืžื“ืขืจ, ืื•ื™ืฃ ืืŸ ืื ื“ืขืจ ืžืึทืฉื™ืŸ ืžื™ื˜ ืึท ืึทื ื“ืขืจืฉ ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹GHC ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ืงื™ื™ืŸ ื‘ืืžืขืจืงื˜ ื—ื™ืœื•ืง.

ื ืึธืš ืกืคึผืขื ื“ื™ื ื’ ืึท ื•ื•ืึธืš ืœื™ื™ืขื ืขืŸ ื“ื™ GHC Core ืจืขื–ื•ืœื˜ืึทื˜, ืื™ืš ืื™ื– ื’ืขื•ื•ืขืŸ ื‘ื™ื›ื•ืœืช ืฆื• ืคืึทืจืจื™ื›ื˜ืŸ ื“ืขื ืคึผืจืึธื‘ืœืขื ืžื™ื˜ ืื™ื™ืŸ ืฉื•ืจื” ืคื•ืŸ ื™ืงืกืคึผืœื™ืกืึทื˜ INLINE. ืื™ืŸ ืขื˜ืœืขื›ืข ืคื•ื ื˜ ืฆื•ื•ื™ืฉืŸ GHC 8.4.4 ืื•ืŸ GHC 8.6.5 ื“ื™ ืึธืคึผื˜ื™ืžื™ื–ืขืจ ืคืืจืฉื˜ืืคื˜ ื˜ืืŸ ื“ืขื ืื•ื™ืฃ ื–ื™ืš.

ืื™ืš ื”ืึธื‘ ื ื™ื˜ ื“ืขืจื•ื•ืึทืจื˜ ืฆื• ื˜ืจืขืคืŸ ืึทื–ืึท ืฉืžื•ืฅ ืื™ืŸ Haskell ืคึผืจืึธื’ืจืึทืžืžื™ื ื’. ืึธื‘ืขืจ, ืืคื™ืœื• ื”ื™ื™ึทื ื˜, ืึธืคึผื˜ื™ืžื™ื–ืขืจืก ืžืืœ ืžืึทื›ืŸ ืžื™ืกื˜ื™ื™ืงืก, ืื•ืŸ ืขืก ืื™ื– ืื•ื ื“ื–ืขืจ ืึทืจื‘ืขื˜ ืฆื• ื’ืขื‘ืŸ ื–ื™ื™ ื”ื™ื ืฅ. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ื“ืึธ ืžื™ืจ ื•ื•ื™ืกืŸ ืึทื– ื“ื™ ืคึฟื•ื ืงืฆื™ืข ื–ืึธืœ ื–ื™ื™ืŸ ื™ื ืœื™ื™ื ื“ ื•ื•ื™ื™ึทืœ ืขืก ืื™ื– ื™ื ืœื™ื™ื ื“ ืื™ืŸ ื“ื™ ื™ืžืคึผืขืจืึทื˜ื™ื•ื• ื•ื•ืขืจืกื™ืข, ืื•ืŸ ื“ืึธืก ืื™ื– ืึท ืกื™ื‘ื” ืฆื• ื’ืขื‘ืŸ ื“ืขื ืงืึทืžืคึผื™ื™ืœืขืจ ืึท ืึธื ืฆื•ื”ืขืจืขื ื™ืฉ.

ื•ื•ืึธืก ืื™ื– ื’ืขืฉืขืŸ ื•ื•ื™ื™ึทื˜ืขืจ?

ื“ืขืจื ืึธืš ืื™ืš ื™ืžืคึผืœืึทืžืขื ืึทื“ ื“ื™ Hopcroft-Karp ืึทืœื’ืขืจื™ื“ืึทื ืžื™ื˜ ืื ื“ืขืจืข ืžืึธื ืึทื“ืก, ืื•ืŸ ื“ืึธืก ืื™ื– ื’ืขื•ื•ืขืŸ ื“ืขืจ ืกื•ืฃ ืคื•ืŸ ื“ื™ ืคึผืจืึธื’ืจืึทื.

ื“ืึทื ืง ืฆื• Google Summer of Code, ืื™ืš ืคืืจื“ื™ื ื˜ ืคึผืจืึทืงื˜ื™ืฉ ื“ืขืจืคืึทืจื•ื ื’ ืื™ืŸ ืคืึทื ื’ืงืฉืึทื ืึทืœ ืคึผืจืึธื’ืจืึทืžืžื™ื ื’, ื•ื•ืึธืก ื ื™ื˜ ื‘ืœื•ื™ื– ื’ืขื”ืึธืœืคึฟืŸ ืžื™ืจ ื‘ืึทืงื•ืžืขืŸ ืึทืŸ ื™ื ื˜ืขืจื ืฉื™ืคึผ ืื™ืŸ Jane Street ื“ื™ ืคืืœื’ืขื ื“ืข ื–ื•ืžืขืจ (ืื™ืš ื‘ื™ืŸ ื ื™ืฉื˜ ื–ื™ื›ืขืจ ื•ื•ื™ ื‘ืึทื•ื•ื•ืกื˜ ื“ืขื ืึธืจื˜ ืื™ื– ืืคื™ืœื• ืฆื•ื•ื™ืฉืŸ Habr ืก ื ืึทืœืึทื“ื–ืฉืึทื‘ืึทืœ ื•ื™ืœืขื, ืึธื‘ืขืจ ืขืก ืื™ื– ืื™ื™ื ืขืจ. ืคื•ืŸ ื“ื™ ื•ื•ื™ื™ื ื™ืง ื•ื•ื• ืื™ืจ ืงืขื ืขืŸ ื–ื•ืžืขืจ ืฆื• ืึธื ื˜ื™ื™ืœ ื ืขืžืขืŸ ืื™ืŸ ืคืึทื ื’ืงืฉืึทื ืึทืœ ืคึผืจืึธื’ืจืึทืžืžื™ื ื’), ืึธื‘ืขืจ ืื•ื™ืš ื‘ืึทืงืขื ืขื  ืžื™ืจ ืฆื• ื“ื™ ื•ื•ื•ื ื“ืขืจืœืขืš ื•ื•ืขืœื˜ ืคื•ืŸ ืึทืคึผืœื™ื™ื™ื ื’ ื“ืขื ืคึผืึทืจืึทื“ื™ื’ื ืื™ืŸ ืคื™ืจ, ื‘ืื˜ื™ื™ื˜ื™ืง ืึทื ื“ืขืจืฉ ืคื•ืŸ ืžื™ื™ืŸ ื“ืขืจืคืึทืจื•ื ื’ ืื™ืŸ ื˜ืจืื“ื™ืฆื™ืื ืขืœืŸ ืฉืคึผืจืึทื›ืŸ.

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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’