GSoC 2019αŸ– αž€αŸ†αž–αž»αž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αŸ’αžšαžΆαž αŸ’αžœαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαž–αž‘αŸ’αžœαŸαž—αžΆαž‚αžΈ αž“αž·αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž”αŸ†αž”αŸ’αž›αŸ‚αž„αž˜αŸ‰αžΌαžŽαžΆαžŠ

αžšαžŠαžΌαžœαž€αŸ’αžαŸ…αž˜αž»αž“αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž…αžΌαž›αžšαž½αž˜ αž αŸ’αž‚αžΌαž αŸ’αž‚αž›αžšαžŠαžΌαžœαž€αŸ’αžαŸ…αž“αŸƒαž€αžΌαžŠ - αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαž·αžŸαŸ’αžŸαž–αžΈ Google αŸ” αž‡αžΆαžšαŸ€αž„αžšαžΆαž›αŸ‹αž†αŸ’αž“αžΆαŸ† αž’αŸ’αž“αž€αžšαŸ€αž”αž…αŸ†αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž‚αž˜αŸ’αžšαŸ„αž„ Open Source αž‡αžΆαž…αŸ’αžšαžΎαž“ αžšαž½αž˜αž‘αžΆαŸ†αž„αž–αžΈαž’αž„αŸ’αž‚αž€αžΆαžšαž›αŸ’αž”αžΈαŸ—αžŠαžΌαž…αž‡αžΆ Boost.org ΠΈ αž˜αžΌαž›αž“αž·αž’αž·αž›αžΈαž“αž»αž…. Google αž’αž‰αŸ’αž‡αžΎαž‰αžŸαž·αžŸαŸ’αžŸαž˜αž€αž–αžΈαž‡αž»αŸ†αžœαž·αž‰αž–αž·αž—αž–αž›αŸ„αž€αž±αŸ’αž™αž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎαž‚αž˜αŸ’αžšαŸ„αž„αž‘αžΆαŸ†αž„αž“αŸαŸ‡αŸ” 

αž€αŸ’αž“αž»αž„αž“αžΆαž˜αž‡αžΆαž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž“αŸ…αž€αŸ’αž“αž»αž„ Google Summer of Code 2019 αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž’αŸ’αžœαžΎαž‚αž˜αŸ’αžšαŸ„αž„αž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžŽαŸ’αžŽαžΆαž›αŸαž™ αžŸαžΆαžšαžΆαž™αŸ” αž‡αžΆαž˜αž½αž™αž’αž„αŸ’αž‚αž€αžΆαžš Haskell.orgαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αž’αž—αž·αžœαžŒαŸ’αžαž—αžΆαžŸαžΆ Haskell αžŠαŸ‚αž›αž‡αžΆαž—αžΆαžŸαžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž˜αž»αžαž„αžΆαžšαžŠαŸαž›αŸ’αž”αžΈαž›αŸ’αž”αžΆαž‰αž”αŸ†αž•αž»αžαž˜αž½αž™αŸ” Alga αž‚αžΊαž‡αžΆαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŠαŸ‚αž›αžαŸ†αžŽαžΆαž„ αž”αŸ’αžšαž—αŸαž‘αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– αžαŸ†αžŽαžΆαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ’αžšαžΆαž αŸ’αžœαž“αŸ…αž€αŸ’αž“αž»αž„ Haskell αŸ” αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸαž€αŸ’αž“αž»αž„ αž†αž˜αžΆαžŸ - αž”αžŽαŸ’αžŽαžΆαž›αŸαž™ Github αžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαžαžŠαžΎαž˜αžˆαžΎαž’αž€αŸ’αžαžšαžΆαžœαž·αžšαž»αž‘αŸ’αž’ αž€αŸ’αžšαžΆαž αŸ’αžœαž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘ αž“αž·αž„αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž€αžΌαžŠ αž αžΎαž™αž’αžΆαž…αž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αžœαžΆαž”αžΆαž“αŸ” αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž‚αžΊαžŠαžΎαž˜αŸ’αž”αžΈαž”αž“αŸ’αžαŸ‚αž˜αžαŸ†αžŽαžΆαž„αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž”αŸ’αžšαž—αŸαž‘αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ’αžšαžΆαž αŸ’αžœαž·αž€αž‘αŸ’αžœαŸαž—αžΆαž‚αžΈ αž“αž·αž„αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžαŸ†αžŽαžΆαž„αž“αŸ„αŸ‡αŸ” 

αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαž€αžΆαžŸαž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž“αŸƒαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αŸ’αžšαžΆαž αŸ’αžœαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαž–αž‘αŸ’αžœαŸαž—αžΆαž‚αžΈαž“αŸ…αž€αŸ’αž“αž»αž„ Haskell αŸ” αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‚αžΊαž‡αžΆαž•αŸ’αž“αŸ‚αž€αž˜αž½αž™αž“αŸƒαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž”αŸ†αž•αž»αžαž€αŸαžŠαŸ„αž™ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžœαžΆαž™αŸ‰αžΆαž„αžŸαŸ’αžšαžŸαŸ‹αžŸαŸ’αž’αžΆαžαž“αŸ…αž€αŸ’αž“αž»αž„αžšαž…αž“αžΆαž”αŸαž‘αŸ’αž˜αž˜αž»αžαž„αžΆαžšαž”αžΆαž“αž’αŸ’αžœαžΎαž±αŸ’αž™αžαŸ’αž‰αž»αŸ†αž’αŸ’αžœαžΎαž˜αŸ’αžαž„αž‘αŸ€αžαž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαž„ αž“αž·αž„αž‘αžΆαž˜αž‘αžΆαžšαž€αžΆαžšαž„αžΆαžšαž…αŸ’αžšαžΎαž“αŸ” αž‡αžΆαž›αž‘αŸ’αž’αž•αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž›αžΎαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž‡αžΆαž˜αž½αž™ monad transformers αŸ” 

GSoC 2019αŸ– αž€αŸ†αž–αž»αž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αŸ’αžšαžΆαž αŸ’αžœαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαž–αž‘αŸ’αžœαŸαž—αžΆαž‚αžΈ αž“αž·αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž”αŸ†αž”αŸ’αž›αŸ‚αž„αž˜αŸ‰αžΌαžŽαžΆαžŠ

αž’αŸ†αž–αžΈαžαŸ’αž›αž½αž“αžαŸ’αž‰αž»αŸ†

αžˆαŸ’αž˜αŸ„αŸ‡αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž‚αžΊ Vasily Alferov αžαŸ’αž‰αž»αŸ†αž‡αžΆαž“αž·αžŸαŸ’αžŸαž·αžαž†αŸ’αž“αžΆαŸ†αž‘αžΈ 4 αž“αŸ… St. Petersburg HSE αŸ” αž˜αž»αž“αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž€αŸ‹αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαžšαžŸαŸαžš αž’αŸ†αž–αžΈαž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž’αŸ†αž–αžΈαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš ΠΈ αž’αŸ†αž–αžΈαž€αžΆαžšαž’αŸ’αžœαžΎαžŠαŸ†αžŽαžΎαžšαž‘αŸ… ZuriHac. αž–αŸαž›αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž€αŸ†αž–αž»αž„αž αžΆαžαŸ‹αž€αžΆαžšαž“αŸ… αžŸαžΆαž€αž›αžœαž·αž‘αŸ’αž™αžΆαž›αŸαž™ Bergen αž“αŸ…αž”αŸ’αžšαž‘αŸαžŸαž“αŸαžšαžœαŸαžŸ αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž€αŸ†αž–αž»αž„αž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆ αž”αž‰αŸ’αž‡αžΈαž–αžŽαŸŒ. αž…αŸ†αžŽαžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αžšαž½αž˜αž˜αžΆαž“αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš αž“αž·αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž˜αž»αžαž„αžΆαžšαŸ”

αž’αŸ†αž–αžΈαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™

αž”αž»αž–αŸ’αžœαž€αžαžΆ

αžŸαž·αžŸαŸ’αžŸαžΆαž“αž»αžŸαž·αžŸαŸ’αžŸαžŠαŸ‚αž›αž…αžΌαž›αžšαž½αž˜αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž›αžΎαž€αž‘αžΉαž€αž…αž·αžαŸ’αžαž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαžšαžŸαŸαžšαž”αŸ’αž›αž»αž€αŸ” αž–αž½αž€αž‚αŸαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αžαŸ’αž‰αž»αŸ†αž“αžΌαžœαžœαŸαž‘αž·αž€αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αž›αž»αž€ αžšαžŠαžΌαžœαž€αŸ’αžαŸ…αž“αŸƒ Haskell. αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αžΆαžšαž”αž€αž”αŸ’αžšαŸ‚ αž’αžαŸ’αžαž”αž‘αžŸαžšαžŸαŸαžšαžŠαŸ„αž™αžαŸ’αž‰αž»αŸ†αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αž€αŸ’αž“αž»αž„αžαŸ‚αž€αž€αŸ’αž€αžŠαžΆ αž‡αžΆαž—αžΆαžŸαžΆαž’αž„αŸ‹αž‚αŸ’αž›αŸαžŸ αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αž»αž–αŸ’αžœαž€αžαžΆαžαŸ’αž›αžΈαŸ” 

αž‘αžΆαž‰αžŸαŸ†αžŽαžΎαžŠαŸ„αž™αž”αŸ’αžšαžΎαž›αŸαžαž€αžΌαžŠαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ†αžŽαž½αžšαž’αžΆαž…αžšαž€αž”αžΆαž“ αž“αŸ…αž‘αžΈαž“αŸαŸ‡.

αž’αŸ’αž“αž€αž’αžΆαž…αž’αžΆαž“αž’αŸ†αž–αžΈαž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† (αž‡αžΆαž—αžΆαžŸαžΆαž’αž„αŸ‹αž‚αŸ’αž›αŸαžŸ) αž“αŸ…αž‘αžΈαž“αŸαŸ‡.

αž”αŸ’αžšαž€αžΆαžŸαž“αŸαŸ‡αžŸαž“αŸ’αž˜αžαŸ‹αžαžΆαž’αŸ’αž“αž€αž’αžΆαž“αž”αžΆαž“αžŸαŸ’αž‚αžΆαž›αŸ‹αž‚αŸ„αž›αž‚αŸ†αž“αž·αžαž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž˜αžΆαž“αž˜αž»αžαž„αžΆαžš αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž–αŸ’αž™αžΆαž™αžΆαž˜αžšαŸ†αž›αžΉαž€αž‘αžΎαž„αžœαž·αž‰αž“αžΌαžœαž–αžΆαž€αŸ’αž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž”αŸ’αžšαžΎαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž–αŸαž›αžœαŸαž›αžΆαž˜αž€αžŠαž›αŸ‹αŸ”

αž–αž·αž“αž·αžαŸ’αž™αž€αŸ’αžšαžΆαž αŸ’αžœαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαž–αž‘αŸ’αžœαŸαž—αžΆαž‚αžΈ 

αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αŸ’αžšαžΆαž αŸ’αžœαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαž–αž‘αŸ’αžœαŸαž—αžΆαž‚αžΈαž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž“αŸ…αž€αŸ’αž“αž»αž„αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαžŸαŸ’αžαžΈαž–αžΈαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸ‚αž›αž‡αžΆαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αŸ’αžšαžΆαž αŸ’αžœαžŠαŸαžŸαžΆαž˜αž‰αŸ’αž‰αž”αŸ†αž•αž»αžαž˜αž½αž™αŸ” αž‚αŸ†αž“αž·αžαžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹αž‚αžΊαžαŸ’αžšαž„αŸ‹αŸ– αžŠαŸ†αž”αžΌαž„αž™αžΎαž„αžŠαžΆαž€αŸ‹αž…αŸ†αž“αž»αž…αž€αŸ†αž–αžΌαž›αž“αŸ…αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ‚αž€αžαžΆαž„αž†αŸ’αžœαŸαž„ αž¬αžŸαŸ’αžαžΆαŸ† αž αžΎαž™αž“αŸ…αž–αŸαž›αžšαž€αžƒαžΎαž‰αž‚αŸ‚αž˜αžŠαŸ‚αž›αž•αŸ’αž‘αž»αž™αž‚αŸ’αž“αžΆ αž™αžΎαž„αž’αŸ‡αž’αžΆαž„αžαžΆαž€αŸ’αžšαžΆαž αŸ’αžœαž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž‘αŸ’αžœαŸαž—αžΆαž‚αžΈαž‘αŸαŸ”

αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαž·αž…αŸ– αžŠαŸ†αž”αžΌαž„αž™αžΎαž„αžŠαžΆαž€αŸ‹αž…αŸ†αž“αž»αž…αž€αŸ†αž–αžΌαž›αž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αžαžΆαž„αž†αŸ’αžœαŸαž„αŸ” αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ αž”αŸ’αžšαž‘αŸαžŸαž‡αž·αžαžαžΆαž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸƒαž…αŸ†αž“αž»αž…αž€αŸ†αž–αžΌαž›αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαžαŸ‚αžŠαŸαž€αž“αŸ…αž€αŸ’αž“αž»αž„ lobe αžαžΆαž„αžŸαŸ’αžαžΆαŸ†αŸ” αž‡αžΆαž„αž“αŸαŸ‡αž‘αŸ…αž‘αŸ€αž αž’αŸ’αž“αž€αž‡αž·αžαžαžΆαž„β€‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹β€‹αžšαž”αžŸαŸ‹β€‹αž’αŸ’αž“αž€β€‹αž‡αž·αžαžαžΆαž„β€‹αž“αŸƒβ€‹αž…αŸ†αžŽαž»αž…β€‹αž€αŸ†αž–αžΌαž›β€‹αž“αŸαŸ‡β€‹αžαŸ’αžšαžΌαžœβ€‹αžŠαŸαž€β€‹αž“αŸ…β€‹αž•αŸ’αž“αŸ‚αž€β€‹αžαžΆαž„αž†αŸ’αžœαŸαž„ αž αžΎαž™β€‹αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αž“αŸ…αž›αžΎβ€‹αŸ” αž™αžΎαž„αž”αž“αŸ’αžαž€αŸ†αžŽαžαŸ‹αž€αžΆαžšαž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž‘αŸ…αž…αŸ†αž“αž»αž…αž€αŸ†αž–αžΌαž› αžŠαžšαžΆαž”αžŽαžΆαž“αŸ…αž˜αžΆαž“αž…αŸ†αž“αž»αž…αž€αŸ†αž–αžΌαž›αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαž˜αžΆαžŸαž’αžΆαžαž»αžαž—αŸ’αž‡αžΆαž”αŸ‹αž“αŸƒαž…αŸ†αž“αž»αž…αž€αŸ†αž–αžΌαž›αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αžΆαž˜αž½αž™αžŠαŸ‚αž›αž™αžΎαž„αž˜αž·αž“αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž±αŸ’αž™αž’αŸ’αž“αž€αž‡αž·αžαžαžΆαž„αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž™αžΎαž„αž’αŸ’αžœαžΎαžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž“αŸαŸ‡αž˜αŸ’αžαž„αž‘αŸ€αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαž˜αžΆαžŸαž’αžΆαžαž»αžŠαŸ‚αž›αž”αžΆαž“αžαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αžΆαž“αž‚αŸ‚αž˜αžšαžœαžΆαž„αž…αŸ†αž“αž»αž…αž€αŸ†αž–αžΌαž›αžŠαŸ‚αž›αž’αŸ’αž›αžΆαž€αŸ‹αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž—αžΆαž‚αžαžΆαžŸαžŠαžΌαž…αž‚αŸ’αž“αžΆ αžœαžΆαž˜αž·αž“αž–αž·αž”αžΆαž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αžœαžŠαŸ’αžŠαžŸαŸαžŸαž€αŸ’αž“αž»αž„αž€αŸ’αžšαžΆαž αŸ’αžœ αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαžŸαŸ’αž‚αžΆαž›αŸ‹αž™αŸ‰αžΆαž„αž‘αžΌαž›αŸ†αž‘αžΌαž›αžΆαž™ (αž αžΎαž™αž…αŸ’αž”αžΆαžŸαŸ‹αžŽαžΆαžŸαŸ‹) αž˜αž·αž“αž’αžΆαž…αž‘αŸ…αžšαž½αž…αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ’αžšαžΆαž αŸ’αžœαž‘αŸ’αžœαŸαž—αžΆαž‚αžΈαž“αŸ„αŸ‡αž‘αŸαŸ” αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸ„αŸ‡αž‘αŸαž™αžΎαž„αž˜αžΆαž“αž—αžΆαž‚αžαžΆαžŸαžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαžŠαŸ‚αž›αž˜αžΆαž“αž“αŸαž™αžαžΆαž€αŸ’αžšαžΆαž αŸ’αžœαž‚αžΊαž‘αŸ’αžœαŸαž—αžΆαž‚αžΈαŸ”

αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆ αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž”αŸ’αžšαžΎ αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αžŠαŸ†αž”αžΌαž„ ឬ αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž‡αž˜αŸ’αžšαŸ…αžŠαŸ†αž”αžΌαž„. αž‡αžΆαž—αžΆαžŸαžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž‡αž˜αŸ’αžšαŸ…αžŠαŸ†αž”αžΌαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž–αŸ’αžšαŸ„αŸ‡αžœαžΆαžŸαžΆαž˜αž‰αŸ’αž‰αž‡αžΆαž„αž”αž“αŸ’αžαž·αž… αž αžΎαž™αž˜αž·αž“αžαŸ’αžšαžΌαžœαž€αžΆαžšαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸαŸ” αžαŸ’αž‰αž»αŸ†β€‹αž€αŸβ€‹αž”αžΆαž“β€‹αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸβ€‹αž€αžΆαžšβ€‹αžŸαŸ’αžœαŸ‚αž„αžšαž€β€‹αž‡αž˜αŸ’αžšαŸ…β€‹αžŠαŸ†αž”αžΌαž„β€‹αžŠαŸ‚αžš αž–αŸ’αžšαŸ„αŸ‡β€‹αžœαžΆβ€‹αž‡αžΆβ€‹αž”αŸ’αžšαž–αŸƒαžŽαžΈβ€‹αž‡αžΆαž„αŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž”αžΆαž“αž˜αž€αžŠαž›αŸ‹αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ” αž™αžΎαž„αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž…αŸ†αž“αž»αž…αž€αŸ†αž–αžΌαž›αž“αŸƒαž€αŸ’αžšαžΆαž αŸ’αžœαžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž‡αž˜αŸ’αžšαŸ…αžŠαŸ†αž”αžΌαž„ αž αžΎαž™αž•αŸ’αžαž›αŸ‹αž€αžΆαžšαž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αžŠαž›αŸ‹αž–αž½αž€αž‚αŸ αžŠαŸ„αž™αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž…αŸ†αž“αž½αž“αž“αŸƒαž€αžΆαžšαž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž“αŸ…αž–αŸαž›αž™αžΎαž„αž•αŸ’αž›αžΆαžŸαŸ‹αž‘αžΈαžαžΆαž˜αž‚αŸ‚αž˜αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž–αŸ’αž™αžΆαž™αžΆαž˜αž€αŸ†αžŽαžαŸ‹αž€αžΆαžšαž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž‘αŸ…αž…αŸ†αžŽαž»αž…αž€αŸ†αž–αžΌαž›αžŠαŸ‚αž›αž˜αžΆαž“αž…αŸ†αžŽαŸ‚αž€αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž½αž…αž αžΎαž™ αž™αžΎαž„αž’αžΆαž…αž“αž·αž™αžΆαž™αžŠαŸ„αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αžαžΆαž€αŸ’αžšαžΆαž αŸ’αžœαž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž‘αŸ’αžœαŸαž—αžΆαž‚αžΈαž‘αŸαŸ” αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž…αŸ†αž“αž»αž…αž€αŸ†αž–αžΌαž›αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž…αŸ†αžŽαŸ‚αž€ αž αžΎαž™αž™αžΎαž„αž”αžΆαž“αž˜αžΎαž›αž‚αŸ‚αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αž™αžΎαž„αž˜αžΆαž“αž—αžΆαž‚αžαžΆαžŸαžŠαŸαž›αŸ’αž’αŸ”

αž—αžΆαž–αž”αžšαž·αžŸαž»αž‘αŸ’αž’αž“αŸƒαž€αžΆαžšαž‚αžŽαž“αžΆ

αž“αŸ…αž€αŸ’αž“αž»αž„ Haskell αž™αžΎαž„αžŸαž“αŸ’αž˜αžαžαžΆαž€αžΆαžšαž‚αžŽαž“αžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αžΊ αžŸαŸ’αž’αžΆαžαŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž“αŸαŸ‡αž‡αžΆαž€αžšαžŽαžΈαž–αž·αž αž™αžΎαž„αž“αžΉαž„αž‚αŸ’αž˜αžΆαž“αžœαž·αž’αžΈαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž’αŸ’αžœαžΈαž›αžΎαž’αŸαž€αŸ’αžšαž„αŸ‹αž“αŸ„αŸ‡αž‘αŸαŸ” αž‘αžΆαŸ†αž„αž’αžŸαŸ‹, αžŸαŸ’αž’αžΆαž αž€αžΆαžšαž‚αžŽαž“αžΆαž‚αžΊαžαŸ’αž‡αž·αž›αžŽαžΆαžŸαŸ‹αžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αž˜αž½αž™αŸ” αžŸαŸ’αž’αžΆαž αž αŸαžαž»αž•αž›αžŠαžΎαž˜αŸ’αž”αžΈαž‚αžŽαž“αžΆαž’αŸ’αžœαžΈαž˜αž½αž™αŸ” αž€αžΆαžšαž‚αžŽαž“αžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αžαŸ†αžŠαŸ„αž™αžŠαžΌαž…αž˜αŸ’αžŠαŸαž… "αž˜αž·αž“αžŸαŸ’αž’αžΆαž" Monad IO αŸ”

Monads αž‚αžΊαž‡αžΆαžœαž·αž’αžΈαž˜αž½αž™αžŠαžΎαž˜αŸ’αž”αžΈαžαŸ†αžŽαžΆαž„αž±αŸ’αž™αž€αžΆαžšαž‚αžŽαž“αžΆαž‡αžΆαž˜αž½αž™ αž•αž›αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹ αž“αŸ… Haskell αŸ” αž€αžΆαžšαž–αž“αŸ’αž™αž›αŸ‹αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž–αž½αž€αž‚αŸαž’αŸ’αžœαžΎαž€αžΆαžšαž‚αžΊαž αž½αžŸαž–αžΈαžœαž·αžŸαžΆαž›αž—αžΆαž–αž“αŸƒαž”αŸ’αžšαž€αžΆαžŸαž“αŸαŸ‡αŸ” αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž›αŸ’αž’ αž“αž·αž„αž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹αž’αžΆαž…αž’αžΆαž“αž‡αžΆαž—αžΆαžŸαžΆαž’αž„αŸ‹αž‚αŸ’αž›αŸαžŸαž”αžΆαž“αŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡.

αž“αŸ…αž‘αžΈαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž…αž„αŸ’αž’αž»αž›αž”αž„αŸ’αž αžΆαž‰αžαžΆαžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž› monads αž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαžΌαž…αž‡αžΆ IO αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžαžΆαž˜αžšαž™αŸˆ compiler magic αžŸαŸ’αž‘αžΎαžšαžαŸ‚αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž αžΎαž™αž€αžΆαžšαž‚αžŽαž“αžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαž‚αžΊαžŸαž»αž‘αŸ’αž’αŸ”

αž˜αžΆαž“αž•αž›αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αž‡αžΆαž…αŸ’αžšαžΎαž“αž αžΎαž™αž“αžΈαž˜αž½αž™αŸ—αž˜αžΆαž“ monad αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž‘αŸ’αžšαžΉαžŸαŸ’αžŠαžΈαžŠαŸαžšαžΉαž„αž˜αžΆαŸ† αž“αž·αž„αžŸαŸ’αžšαžŸαŸ‹αžŸαŸ’αž’αžΆαžαŸ– monads αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž’αž“αž»αžœαžαŸ’αžαž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ” αž™αžΎαž„β€‹αž“αžΉαž„β€‹αž“αž·αž™αžΆαž™β€‹αž’αŸ†αž–αžΈβ€‹αž–αŸ’αžšαŸ‡β€‹αž’αž„αŸ’αž‚β€‹αž”αžΈβ€‹αž’αž„αŸ’αž‚β€‹αžŠαžΌαž…β€‹αžαžΆαž„β€‹αž€αŸ’αžšαŸ„αž˜αŸ–

  • αž‘αžΆαŸ†αž„ ea αž‚αžΊαž‡αžΆαž€αžΆαžšαž‚αžŽαž“αžΆαžŠαŸ‚αž›αžαŸ’αžšαž‘αž”αŸ‹αžαž˜αŸ’αž›αŸƒαž“αŸƒαž”αŸ’αžšαž—αŸαž‘ a αž¬αž”αŸ„αŸ‡αž€αžšαžŽαžΈαž›αžΎαž€αž›αŸ‚αž„αž“αŸƒαž”αŸ’αžšαž—αŸαž‘ e αŸ” αž’αžΆαž€αž”αŸ’αž”αž€αž·αžšαž·αž™αžΆαžšαž”αžŸαŸ‹ monad αž“αŸαŸ‡αž‚αžΊαžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆαž‘αŸ…αž“αžΉαž„αž€αžΆαžšαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αžšαžŽαžΈαž›αžΎαž€αž›αŸ‚αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž—αžΆαžŸαžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹: αž€αŸ†αž αž»αžŸαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž”αžΆαž“αž¬αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αŸ” αž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαžŸαŸ†αžαžΆαž“αŸ‹αž‚αžΊαžαžΆ monad αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž™αŸ‰αžΆαž„αž–αŸαž‰αž›αŸαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž“αŸ… Haskell αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž—αžΆαžŸαžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž”αŸ’αžšαžΎαž™αž“αŸ’αžαž€αžΆαžšαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαŸ”
  • αžšαžŠαŸ’αž‹ sa αž‚αžΊαž‡αžΆαž€αžΆαžšαž‚αžŽαž“αžΆαžŠαŸ‚αž›αžαŸ’αžšαž‘αž”αŸ‹αžαž˜αŸ’αž›αŸƒαž“αŸƒαž”αŸ’αžšαž—αŸαž‘ a αž“αž·αž„αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αž…αžΌαž›αž”αŸ’αžšαžΎαžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŠαŸ‚αž›αž’αžΆαž…αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αžΆαž“αž“αŸƒαž”αŸ’αžšαž—αŸαž‘ s αŸ”
  • αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆ αž€. The May monad αž”αž„αŸ’αž αžΆαž‰αž–αžΈαž€αžΆαžšαž‚αžŽαž“αžΆαžŠαŸ‚αž›αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ†αžαžΆαž“αž“αŸ…αž–αŸαž›αžŽαžΆαž˜αž½αž™αžŠαŸ„αž™αžαŸ’αžšαž‘αž”αŸ‹ Nothing αŸ” αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™αž™αžΎαž„αž“αžΉαž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžαŸ’αž“αžΆαž€αŸ‹ MonadPlus αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαž—αŸαž‘ Maybe αžŠαŸ‚αž›αž”αž„αŸ’αž αžΆαž‰αž–αžΈαž₯αž‘αŸ’αž’αž·αž–αž›αž•αŸ’αž‘αž»αž™αž‚αŸ’αž“αžΆαŸ– αžœαžΆαž‚αžΊαž‡αžΆαž€αžΆαžšαž‚αžŽαž“αžΆαžŠαŸ‚αž›αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ†αžαžΆαž“αž“αŸ…αž–αŸαž›αžŽαžΆαž˜αž½αž™αžŠαŸ„αž™αžαŸ’αžšαž‘αž”αŸ‹αžαž˜αŸ’αž›αŸƒαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™αŸ”

αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™

αž™αžΎαž„αž˜αžΆαž“αž”αŸ’αžšαž—αŸαž‘αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαžšαž‚αžΊ Graph a αž“αž·αž„ Bigraph ab αžŠαŸ‚αž›αž‘αžΈαž˜αž½αž™αžαŸ†αžŽαžΆαž„αž±αŸ’αž™αž€αŸ’αžšαžΆαž αŸ’αžœαžŠαŸ‚αž›αž˜αžΆαž“αž”αž“αŸ’αž‘αžΆαžαŸ‹αž”αž‰αŸ’αžˆαžšαžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αž›αžΆαž€αžαž˜αŸ’αž›αŸƒαž“αŸƒαž”αŸ’αžšαž—αŸαž‘ a αž“αž·αž„αž‘αžΈαž–αžΈαžšαžαŸ†αžŽαžΆαž„αž±αŸ’αž™αž€αŸ’αžšαžΆαž αŸ’αžœαž‘αŸ’αžœαŸαž—αžΆαž‚αžΈαž‡αžΆαž˜αž½αž™αž…αŸ†αž“αž»αž…αž€αŸ†αž–αžΌαž›αžαžΆαž„αž†αŸ’αžœαŸαž„αžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αž›αžΆαž€αžαž˜αŸ’αž›αŸƒαž“αŸƒαž”αŸ’αžšαž—αŸαž‘ a αž“αž·αž„αžαžΆαž„αžŸαŸ’αžαžΆαŸ†αŸ” -side vertices αžŠαŸ‚αž›β€‹αž˜αžΆαž“β€‹αžŸαŸ’αž›αžΆαž€β€‹αžαž˜αŸ’αž›αŸƒβ€‹αž“αŸƒβ€‹αž”αŸ’αžšαž—αŸαž‘ b αŸ”

αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž”αŸ’αžšαž—αŸαž‘αž–αžΈαž”αžŽαŸ’αžŽαžΆαž›αŸαž™ Alga αž‘αŸαŸ” Alga αž˜αž·αž“αž˜αžΆαž“αžαŸ†αžŽαžΆαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ’αžšαžΆαž αŸ’αžœαž‘αŸ’αžœαŸαž—αžΆαž‚αžΈαžŠαŸ‚αž›αž˜αž·αž“αž”αžΆαž“αžŠαžΉαž€αž“αžΆαŸ†αž‘αŸαŸ” αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž”αŸ’αžšαž—αŸαž‘β€‹αž“αŸαŸ‡β€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž—αžΆαž–β€‹αž…αŸ’αž”αžΆαžŸαŸ‹β€‹αž›αžΆαžŸαŸ‹αŸ”

αž™αžΎαž„αž€αŸαž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž˜αž»αžαž„αžΆαžšαž‡αŸ†αž“αž½αž™αžŠαŸ‚αž›αž˜αžΆαž“αž αžαŸ’αžαž›αŸαžαžΆαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

-- Бписок сосСдСй Π΄Π°Π½Π½ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹.
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)

αžœαžΆαž‡αžΆαž€αžΆαžšαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž˜αžΎαž›αžƒαžΎαž‰αžαžΆ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αžŸαŸ’αžœαŸ‚αž„αžšαž€αž‡αž˜αŸ’αžšαŸ…αžŠαŸ†αž”αžΌαž„ αž™αžΎαž„αž”αžΆαž“αžšαž€αžƒαžΎαž‰αž‚αŸ‚αž˜αžŠαŸ‚αž›αž•αŸ’αž‘αž»αž™αž‚αŸ’αž“αžΆαž“αŸ„αŸ‡ αžœαžŠαŸ’αžαžŸαŸαžŸαžŸαŸ’αžαž·αžαž“αŸ…αž›αžΎαž€αŸ†αž–αžΌαž›αž“αŸƒαž‡αž„αŸ‹αž€αžΆαžšαž αŸ…αž‘αžΎαž„αžœαž·αž‰αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžŠαžΆαžšαžœαžΆαž‘αžΎαž„αžœαž·αž‰ αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžαŸ‹αž•αŸ’αžαžΆαž…αŸ‹αž’αŸ’αžœαžΈαŸ—αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž…αŸαž‰αž–αžΈαž€αžΆαžšαž”αŸ’αžšαž˜αžΌαž›αž‘αžΎαž„αžœαž·αž‰ αžšαž αžΌαžαžŠαž›αŸ‹αž€αžΆαžšαž€αžΎαžαž‘αžΎαž„αžŠαŸ†αž”αžΌαž„αž“αŸƒαž…αŸ†αžŽαž»αž…αž…αž»αž„αž€αŸ’αžšαŸ„αž™αŸ”

αž™αžΎαž„αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž‡αž˜αŸ’αžšαŸ…αžŠαŸ†αž”αžΌαž„αžŠαŸ„αž™αžšαž€αŸ’αžŸαžΆαž’αžΆαžšαŸαž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž“αŸƒαž›αŸαžαž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž…αŸ†αžŽαž»αž…αž“αžΈαž˜αž½αž™αŸ—αŸ” αž‡αž„αŸ‹ recursion αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžαžΆαž˜αžšαž™αŸˆαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž“αŸƒαžαŸ’αž“αžΆαž€αŸ‹ Functor αž“αŸƒ monad αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸ: αž™αžΎαž„αž“αžΉαž„αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŠαžΆαž€αŸ‹αž”αž‰αŸ’αžˆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž–αžΈαž•αŸ’αž›αžΌαžœαž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž›αž‘αŸ’αž’αž•αž›αžŠαŸ‚αž›αžαŸ’αžšαž‘αž”αŸ‹αž–αžΈαž˜αž»αžαž„αžΆαžš recursive αŸ”

αž‚αŸ†αž“αž·αžαžŠαŸ†αž”αžΌαž„αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž‚αžΊαž”αŸ’αžšαžΎ Either monad αžŠαŸ‚αž›αž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαž’αž“αž»αžœαžαŸ’αžαž™αŸ‰αžΆαž„αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαž“αžΌαžœαž•αž›αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ” αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžŠαŸ†αž”αžΌαž„αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαžšαžŸαŸαžšαž‚αžΊαž‡αž·αžαžŸαŸ’αž“αž·αž‘αŸ’αž’αž“αžΉαž„αž‡αž˜αŸ’αžšαžΎαžŸαž“αŸαŸ‡αŸ” αžαžΆαž˜αž–αž·αžαž‘αŸ… αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž”αŸ’αžšαžΆαŸ†αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž“αŸ…αž…αŸ†αžŽαž»αž…αž˜αž½αž™ αž αžΎαž™αž“αŸ…αž‘αžΈαž”αŸ†αž•αž»αžαž”αžΆαž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž›αžΎαž˜αž½αž™αž‘αŸ€αžαŸ”

αž‡αžΆαžŠαŸ†αž”αžΌαž„ αž™αžΎαž„αžαŸ’αžšαžΌαžœαžšαž€αŸ’αžŸαžΆαž’αžΆαžšαŸαžŸαž αž€αžΆαžšαž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€ - αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈαž˜αž½αž™αž’αŸ†αž–αžΈαžšαžŠαŸ’αž‹αŸ” αž‘αžΈαž–αžΈαžš αž™αžΎαž„αžαŸ’αžšαžΌαžœαžαŸ‚αž’αžΆαž…αž”αž‰αŸ’αžˆαž”αŸ‹αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž˜αžΆαž“αž‡αž˜αŸ’αž›αŸ„αŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αŸ” αž“αŸαŸ‡αž’αžΆαž…αž‡αžΆ Monad for Either ឬ MonadPlus for MaybeαŸ” αž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαž…αŸ†αž”αž„αž‚αžΊαžαžΆ αž‘αžΆαŸ†αž„αž’αžΆαž…αžαŸ’αžšαž‘αž”αŸ‹αžαž˜αŸ’αž›αŸƒαž˜αž½αž™ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αžΆαžšαž‚αžŽαž“αžΆαž˜αž·αž“αž‘αžΆαž“αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αžˆαž”αŸ‹ αž αžΎαž™αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαžαŸ’αžšαž‘αž”αŸ‹αžαŸ‚αž–αŸαžαŸŒαž˜αžΆαž“αž’αŸ†αž–αžΈαžšαžΏαž„αž“αŸαŸ‡αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αžŠαŸ„αž™β€‹αžŸαžΆαžšβ€‹αž™αžΎαž„β€‹αž˜αž·αž“β€‹αžαŸ’αžšαžΌαžœβ€‹αž€αžΆαžšβ€‹αžαž˜αŸ’αž›αŸƒβ€‹αžŠαžΆαž…αŸ‹β€‹αžŠαŸ„αž™β€‹αž‘αŸ‚αž€β€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž—αžΆαž–β€‹αž‡αŸ„αž‚αž‡αŸαž™ (αžœαžΆβ€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αžšαž€αŸ’αžŸαžΆβ€‹αž‘αž»αž€β€‹αžšαž½αž…β€‹αž αžΎαž™β€‹αž€αŸ’αž“αž»αž„β€‹αžšαžŠαŸ’αž‹) αž™αžΎαž„β€‹αž‡αŸ’αžšαžΎαžŸβ€‹αžšαžΎαžŸβ€‹αž”αŸ’αžšαž αŸ‚αž›αŸ” αž αžΎαž™β€‹αž“αŸ…β€‹αž–αŸαž›β€‹αžŠαŸ‚αž›β€‹αž™αžΎαž„β€‹αžαŸ’αžšαžΌαžœβ€‹αž€αžΆαžšβ€‹αžšαž½αž˜β€‹αž”αž‰αŸ’αž…αžΌαž›β€‹αž₯αž‘αŸ’αž’αž·αž–αž›β€‹αž“αŸƒ monads αž–αžΈαžšβ€‹αžœαžΆβ€‹αž…αŸαž‰β€‹αž˜αž€β€‹ αž§αž”αž€αžšαžŽαŸαž”αŸ†αž›αŸ‚αž„ monadαžŠαŸ‚αž›αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž™αŸ‰αžΆαž„αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αžΌαžœαž•αž›αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αž‘αžΆαŸ†αž„αž“αŸαŸ‡αŸ”

αž αŸαžαž»αž’αŸ’αžœαžΈαž”αžΆαž“αž‡αžΆαžαŸ’αž‰αž»αŸ†αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž”αŸ’αžšαž—αŸαž‘αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž”αŸ‚αž”αž“αŸαŸ‡? αž αŸαžαž»αž•αž›αž–αžΈαžšαŸ” αž‘αžΈαž˜αž½αž™ αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž”αŸ’αžšαŸ‚αž‡αžΆαžŸαŸ’αžšαžŠαŸ€αž„αž“αžΉαž„αž€αžΆαžšαž…αžΆαŸ†αž”αžΆαž…αŸ‹αŸ” αž‘αžΈαž–αžΈαžš αž™αžΎαž„αžαŸ’αžšαžΌαžœαžšαŸ€αž”αž…αŸ†αžαž˜αŸ’αž›αŸƒαžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž˜αžΆαž“αž‡αž˜αŸ’αž›αŸ„αŸ‡αž“αŸ…αž–αŸαž›αžαŸ’αžšαž›αž”αŸ‹αž˜αž€αžœαž·αž‰αž–αžΈαž€αžΆαžšαž αŸ…αž‘αžΎαž„αžœαž·αž‰αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžŠαžΆαžšαžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ†αžŸαŸαžŸ αžŠαŸ‚αž›αž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž’αŸ’αžœαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ 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)

αž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž”αŸ’αž›αž»αž€αž‚αžΊαž‡αžΆαžŸαŸ’αž“αžΌαž›αž“αŸƒαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αŸ” αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž–αŸ’αž™αžΆαž™αžΆαž˜αž–αž“αŸ’αž™αž›αŸ‹αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαŸ”

  • inVertex αž‚αžΊαž‡αžΆαž•αŸ’αž“αŸ‚αž€αž˜αž½αž™αž“αŸƒαž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž‡αŸ†αžšαŸ…αžŠαŸ†αž”αžΌαž„ αžŠαŸ‚αž›αž™αžΎαž„αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹ vertex αž‡αžΆαž›αžΎαž€αžŠαŸ†αž”αžΌαž„αŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αž€αŸ†αžŽαžαŸ‹αž›αŸαžαž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž‘αŸ… vertex αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš onEdge αž“αŸ…αž›αžΎαž’αŸ’αž“αž€αž‡αž·αžαžαžΆαž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ” αž“αŸαŸ‡αž€αŸαž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž™αžΎαž„αžŸαŸ’αžŠαžΆαžšαž‡αž„αŸ‹αž€αžΆαžšαž αŸ…αž•αž„αžŠαŸ‚αžšαŸ– αž”αŸ’αžšαžŸαž·αž“αž”αžΎ msum αžαŸ’αžšαž‘αž”αŸ‹αžαž˜αŸ’αž›αŸƒαž˜αž½αž™ αž™αžΎαž„αžšαž»αž‰ vertex v αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αŸ”
  • onEdge αž‚αžΊαž‡αžΆαž•αŸ’αž“αŸ‚αž€αžŠαŸ‚αž›αž™αžΎαž„αž‘αžŸαŸ’αžŸαž“αžΆαž‚αŸ‚αž˜αŸ” αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆαž–αžΈαžšαžŠαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ‚αž˜αž“αžΈαž˜αž½αž™αŸ—αŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαžαžΎ vertex αž“αŸ…αž˜αŸ’αžαžΆαž„αž‘αŸ€αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αŸ…αž‘αžŸαŸ’αžŸαž“αžΆαž αžΎαž™αž¬αž’αžαŸ‹ αž αžΎαž™αž‘αŸ…αž˜αžΎαž›αžœαžΆαž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αž·αž“αž”αžΆαž“αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎβ€‹αž”αžΆαž“β€‹αž…αžΌαž›β€‹αž‘αžŸαŸ’αžŸαž“αžΆ αž™αžΎαž„β€‹αž–αž·αž“αž·αžαŸ’αž™β€‹αž˜αžΎαž›β€‹αžαžΆβ€‹αžαžΎβ€‹αž‚αŸ‚αž˜β€‹αž˜αžΆαž“β€‹αž‡αž˜αŸ’αž›αŸ„αŸ‡β€‹αž¬β€‹αž’αžαŸ‹αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžœαžΆαž‡αžΆ αž™αžΎαž„αžαŸ’αžšαž‘αž”αŸ‹αžαž˜αŸ’αž›αŸƒαžœαž·αž‰ - αž€αŸ†αž–αžΌαž›αž“αŸƒαž‡αž„αŸ‹αž€αžΆαžšαž αŸ…αž‘αžΎαž„αžœαž·αž‰ αžŠαŸ‚αž›αž…αŸ†αžŽαž»αž…αž€αŸ†αž–αžΌαž›αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž“αŸ…αž–αŸαž›αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αŸ”
  • processVertex αž–αž·αž“αž·αžαŸ’αž™αžšαž€αž…αŸ†αž“αž»αž…αž€αŸ†αž–αžΌαž›αž“αžΈαž˜αž½αž™αŸ—αžαžΆαžαžΎαžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΌαž›αž˜αžΎαž› αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„Vertex αž›αžΎαžœαžΆαž¬αž’αžαŸ‹αŸ”
  • dfs αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš processVertex αž“αŸ…αž›αžΎαž€αŸ†αž–αžΌαž›αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

αž’αžŸαŸ‹αž αžΎαž™αŸ”

αž”αŸ’αžšαžœαžαŸ’αžαž·αž“αŸƒαž–αžΆαž€αŸ’αž™ INLINE

αž–αžΆαž€αŸ’αž™ INLINE αž˜αž·αž“β€‹αž˜αŸ‚αž“β€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž’αž“αž»αžœαžαŸ’αžβ€‹αžŠαŸ†αž”αžΌαž„β€‹αž“αŸƒβ€‹αž€αŸ’αž”αž½αž“β€‹αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™β€‹αž“αŸ„αŸ‡β€‹αž‘αŸ αžœαžΆβ€‹αž”αžΆαž“β€‹αž”αž„αŸ’αž αžΆαž‰β€‹αž“αŸ…β€‹αž–αŸαž›β€‹αž€αŸ’αžšαŸ„αž™αŸ” αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž–αŸ’αž™αžΆαž™αžΆαž˜αžŸαŸ’αžœαŸ‚αž„αžšαž€αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžŠαŸ‚αž›αž”αŸ’αžšαžŸαžΎαžšαž‡αžΆαž„αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžšαž€αžƒαžΎαž‰αžαžΆαž€αŸ†αžŽαŸ‚αžŠαŸ‚αž›αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆ INLINE αž˜αžΆαž“αž—αžΆαž–αž™αžΊαžαž™αŸ‰αžΆαžœαž‚αž½αžšαž±αŸ’αž™αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž“αŸ…αž›αžΎαž€αŸ’αžšαžΆαž αŸ’αžœαž˜αž½αž™αž…αŸ†αž“αž½αž“αŸ” αžŠαŸ„αž™αž–αž·αž…αžΆαžšαžŽαžΆαžαžΆαž˜αž»αžαž„αžΆαžš semantically αž‚αž½αžšαžαŸ‚αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΌαž…αž‚αŸ’αž“αžΆ αž“αŸαŸ‡αž’αŸ’αžœαžΎαž±αŸ’αž™αžαŸ’αž‰αž»αŸ†αž—αŸ’αž‰αžΆαž€αŸ‹αž•αŸ’αž’αžΎαž›αž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αŸ” αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž˜αž“αž»αžŸαŸ’αžŸαž…αž˜αŸ’αž›αŸ‚αž€αž€αŸαžŠαŸ„αž™ αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ‚αž›αž˜αžΆαž“αž€αŸ†αžŽαŸ‚αžαž»αžŸαž‚αŸ’αž“αžΆαž“αŸƒ GHC αž˜αž·αž“αž˜αžΆαž“αž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαž‚αž½αžšαž±αŸ’αž™αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž“αŸ„αŸ‡αž‘αŸαŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž…αŸ†αžŽαžΆαž™αž–αŸαž›αž˜αž½αž™αžŸαž”αŸ’αžαžΆαž αŸαž’αžΆαž“αž›αž‘αŸ’αž’αž•αž› GHC Core αžαŸ’αž‰αž»αŸ†αž’αžΆαž…αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αž“αŸ’αž‘αžΆαžαŸ‹αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™ INLINE αŸ” αž“αŸ…αž…αŸ†αžŽαž»αž…αž˜αž½αž™αž…αŸ†αž“αž½αž“αžšαžœαžΆαž„ GHC 8.4.4 αž“αž·αž„ GHC 8.6.5 αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž”αžΆαž“αžˆαž”αŸ‹αž’αŸ’αžœαžΎαžœαžΆαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αŸ”

αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αžšαŸ†αž–αžΉαž„αžαžΆαž“αžΉαž„αž‡αž½αž”αž”αŸ’αžšαž‘αŸ‡αž—αžΆαž–αž€αžαŸ’αžœαž€αŸ‹αž”αŸ‚αž”αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Haskell αž“αŸ„αŸ‡αž‘αŸαŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αžŸαž–αŸ’αžœαžαŸ’αž„αŸƒαž“αŸαŸ‡ αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž–αŸαž›αžαŸ’αž›αŸ‡αž˜αžΆαž“αž€αŸ†αž αž»αžŸ αž αžΎαž™αžœαžΆαž‡αžΆαž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αž™αžΎαž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αŸ’αžαž›αŸ‹αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŠαž›αŸ‹αž–αž½αž€αž‚αŸαŸ” αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αžŠαžΉαž„αžαžΆαž˜αž»αžαž„αžΆαžšαž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž€αŸ’αž“αž»αž„αž‡αž½αžš αž–αŸ’αžšαŸ„αŸ‡αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž”αž‰αŸ’αž…αžΌαž›αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαŸ‚αž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž αžΎαž™αž“αŸαŸ‡αž‡αžΆαž αŸαžαž»αž•αž›αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αžαž›αŸ‹αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŠαž›αŸ‹αž’αŸ’αž“αž€αž…αž„αž€αŸ’αžšαž„αŸ”

αžαžΎαž˜αžΆαž“αž’αŸ’αžœαžΈαž€αžΎαžαž‘αžΎαž„αž”αž“αŸ’αž‘αžΆαž”αŸ‹?

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™ Hopcroft-Karp αž‡αžΆαž˜αž½αž™ monads αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αž αžΎαž™αž“αŸ„αŸ‡αž‡αžΆαž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”

αžŸαžΌαž˜αž’αžšαž‚αž»αžŽαžŠαž›αŸ‹ Google Summer of Code αžαŸ’αž‰αž»αŸ†αž‘αž‘αž½αž›αž”αžΆαž“αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž˜αž»αžαž„αžΆαžš αžŠαŸ‚αž›αž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ‚αž‡αž½αž™αžαŸ’αž‰αž»αŸ†αž±αŸ’αž™αž‘αž‘αž½αž›αž”αžΆαž“αž€αž˜αŸ’αž˜αžŸαž·αž€αŸ’αžŸαžΆαž“αŸ… Jane Street αž“αŸ…αžšαžŠαžΌαžœαž€αŸ’αžαŸ…αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‘αŸ (αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž”αŸ’αžšαžΆαž€αžŠαžαžΆαž€αž“αŸ’αž›αŸ‚αž„αž“αŸαŸ‡αž›αŸ’αž”αžΈαž”αŸ‰αž»αžŽαŸ’αžŽαžΆαž‘αŸ αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž’αŸ’αž“αž€αž‘αžŸαŸ’αžŸαž“αžΆαžŠαŸ‚αž›αž˜αžΆαž“αž…αŸ†αžŽαŸαŸ‡αžŠαžΉαž„αžšαž”αžŸαŸ‹ Habr αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αž˜αž½αž™ αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž€αž“αŸ’αž›αŸ‚αž„αž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž…αžΌαž›αžšαž½αž˜αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž˜αžΆαž“αž˜αž»αžαž„αžΆαžšαž€αŸ’αž“αž»αž„αžšαžŠαžΌαžœαž€αŸ’αžαŸ…) αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αŸαž”αžΆαž“αžŽαŸ‚αž“αžΆαŸ†αžαŸ’αž‰αž»αŸ†αž‘αŸ…αž€αžΆαž“αŸ‹αž–αž·αž—αž–αžŠαŸαž’αžŸαŸ’αž…αžΆαžšαŸ’αž™αž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž‚αŸ†αžšαžΌαž“αŸαŸ‡αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž αžŠαŸ‚αž›αžαž»αžŸαž–αžΈαž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž‡αžΆαž—αžΆαžŸαžΆαž”αŸ’αžšαž–αŸƒαžŽαžΈαŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹