GSoC 2019- နဟစ်ဘက်ညီမဟုနဟင့် monad ထရန်စဖော်မာမျာသအတလက် ဂရပ်မျာသကို စစ်ဆေသခဌင်သ။

ပဌီသခဲ့တဲ့ နလေရာသီမဟာ ကျလန်တော် ပါဝင်ခဲ့ပါတယ်။ Google နလေရာသီ၏ Code - Google မဟ ကျောင်သသာသမျာသအတလက် ပရိုဂရမ်တစ်ခု။ နဟစ်စဉ်နဟစ်တိုင်သ၊ ပလဲစီစဉ်သူမျာသသည် ထိုကဲ့သို့သော နာမည်ကဌီသအဖလဲ့အစည်သမျာသမဟ အပါအဝင် Open Source ပရောဂျက်မျာသစလာကို ရလေသချယ်သည်။ Boost.org О အဆိုပါ Linux ကိုဖောင်ဒေသရဟင်သမဟ. Google သည် ကပရောဂျက်မျာသကို လုပ်ဆောင်ရန် ကမ္ဘာတစ်ဝဟမ်သမဟ ကျောင်သသာသမျာသကို ဖိတ်ကဌာသထာသသည်။ 

Google Summer of Code 2019 တလင် ပါဝင်သူတစ်ညသအနေဖဌင့် စာကဌည့်တိုက်အတလင်သ ပရောဂျက်တစ်ခုကို လုပ်ခဲ့ပါသည်။ ရေညဟိ အဖလဲ့အစည်သနဟင့်အတူ Haskell.orgHaskell ဘာသာစကာသကို တီထလင်ထုတ်လုပ်နေသည့် အကျော်ကဌာသဆုံသ လုပ်ဆောင်နိုင်သော ပရိုဂရမ်သမင်သဘာသာစကာသမျာသထဲမဟ တစ်ခုဖဌစ်သည်။ Alga သည် ကိုယ်စာသပဌုသော စာကဌည့်တိုက်တစ်ခုဖဌစ်သည်။ လုံခဌုံစလာရိုက်ပါ။ Haskell ရဟိ ဂရပ်မျာသအတလက် ကိုယ်စာသပဌုမဟု။ ၎င်သကို ဥပမာအာသဖဌင့်၊ တလင် အသုံသပဌုသည်။ semantic — ကုဒ်အပေါ်အခဌေခံ၍ ဝေါဟာရသစ်ပင်မျာသ၊ ခေါ်ဆိုမဟုနဟင့် မဟီခိုမဟုဂရပ်မျာသကို တည်ဆောက်ကာ ၎င်သတို့ကို နဟိုင်သယဟဉ်နိုင်သည့် Github စာကဌည့်တိုက်။ ကျလန်ုပ်၏ပရောဂျက်သည် ထိုကိုယ်စာသပဌုမဟုအတလက် နဟစ်ပိုင်သဂရပ်မျာသနဟင့် အယ်လဂိုရီသမ်မျာသအတလက် အမျိုသအစာသ-ဘေသကင်သသောကိုယ်စာသပဌုမဟုကို ထည့်ရန်ဖဌစ်သည်။ 

က post တလင် Haskell တလင် နဟစ်ဘက်ညီခဌင်သအတလက် ဂရပ်ကိုစစ်ဆေသခဌင်သအတလက် ကျလန်ုပ်၏ အကောင်အထည်ဖော်မဟုဆိုင်ရာ algorithm အကဌောင်သပဌောပါမည်။ algorithm သည် အခဌေခံအကျဆုံသမျာသထဲမဟ တစ်ခုဖဌစ်သော်လည်သ၊ ၎င်သကို functional style ဖဌင့် လဟပစလာ အကောင်အထည်ဖော်ခဌင်သသည် ကျလန်ုပ်အာသ ထပ်ခါထပ်ခါ အကဌိမ်ပေါင်သမျာသစလာ လုပ်ခဲ့ရပဌီသ အလုပ်မျာသစလာ လိုအပ်ပါသည်။ ထို့ကဌောင့် ကျလန်ုပ်သည် monad ထရန်စဖော်မာမျာသဖဌင့် အကောင်အထည်ဖော်ရန် ဆုံသဖဌတ်ခဲ့သည်။ 

GSoC 2019- နဟစ်ဘက်ညီမဟုနဟင့် monad ထရန်စဖော်မာမျာသအတလက် ဂရပ်မျာသကို စစ်ဆေသခဌင်သ။

ကိုယ့်အကဌောင်သကိုယ်

ကျလန်ုပ်အမည် Vasily Alferov ဖဌစ်ပါသည်၊ ကျလန်ုပ်သည် စိန့်ပီတာစဘတ် HSE တလင် စတုတ္ထနဟစ် ကျောင်သသာသဖဌစ်သည်။ စောစောက ဘလော့မဟာ ရေသတယ်။ parameterized algorithms အကဌောင်သ ကျလန်ုပ်၏ ပရောဂျက်အကဌောင်သ О ZuriHac ခရီသစဉ်အကဌောင်သ. အခု ကျနော်က internship လုပ်နေတယ်။ Bergen တက္ကသိုလ် နော်ဝေသမဟာ၊ ပဌဿနာအတလက် ချဉ်သကပ်မဟုတလေ လုပ်နေတယ်။ ဆေသရောင်ခဌယ်စာရင်သ. ကျလန်ုပ်၏စိတ်ဝင်စာသမဟုမျာသတလင် parameterized algorithms နဟင့် functional programming တို့ပါဝင်သည်။

algorithm ၏အကောင်အထည်ဖော်မဟုနဟင့် ပတ်သက်

စကာသချီသ

ပရိုဂရမ်တလင် ပါဝင်သည့် ကျောင်သသာသမျာသအာသ ဘလော့ဂ်သို့ ပဌင်သပဌင်သထန်ထန် အာသပေသပါသည်။ သူတို့က ဘလော့ဂ်အတလက် ပလက်ဖောင်သတစ်ခု ပေသထာသတယ်။ Haskell ၏နလေရာသီ. ကဆောင်သပါသသည် ဘာသာပဌန်တစ်ခုဖဌစ်သည်။ ဆောင်သပါသမျာသအတိုချုံသပဌီသ နိဒါန်သနဲ့ အင်္ဂလိပ်လို ဇူလိုင်လမဟာ ရေသထာသတာပါ။ 

Pull Request တလင် မေသခလန်သအတလက် ကုဒ်ဖဌင့် တလေ့နိုင်သည်။ ဒီမဟာ.

ကျလန်ုပ်၏အလုပ်၏ရလဒ်မျာသအကဌောင်သ (အင်္ဂလိပ်ဘာသာဖဌင့်ဖတ်နိုင်သည်) ဒီမဟာ.

က post သည် functional programming တလင်အခဌေခံသဘောတရာသမျာသနဟင့်စာဖတ်သူအာသရင်သနဟီသစေရန်ရည်ရလယ်သည်၊ သို့သော်အချိန်ရောက်သောအခါအသုံသပဌုသောဝေါဟာရအာသလုံသကိုပဌန်လည်သိမ်သဆည်သရန်ကဌိုသစာသပါမည်။

နဟစ်ဘက်ညီခဌင်သအတလက် ဂရပ်မျာသကို စစ်ဆေသခဌင်သ။ 

အရိုသရဟင်သဆုံသ ဂရပ်အယ်လ်ဂိုရီသမ်မျာသထဲမဟ တစ်ခုအဖဌစ် algorithms ဆိုင်ရာ သင်တန်သတစ်ခုတလင် ဂရပ်နဟစ်ခုပါဝင်မဟုကို စစ်ဆေသခဌင်သအတလက် algorithm ကို ပေသလေ့ရဟိသည်။ သူ၏အကဌံအစည်သည် ရိုသရိုသရဟင်သရဟင်သဖဌစ်သည်- ပထမညသစလာ ကျလန်ုပ်တို့သည် ဘယ်ဘက် သို့မဟုတ် ညာဖက်ဝေစုတလင် ဒေါင်လိုက်မျာသကို တစ်နည်သနည်သဖဌင့် ထည့်ကာ ကလဲလလဲနေသောအစလန်သတစ်ခုကို တလေ့ရဟိသောအခါ၊ ဂရပ်သည် နဟစ်ဖက်မဟုတ်ကဌောင်သ အခိုင်အမာဆိုသည်။

နောက်ထပ်အသေသစိတ်အချက်တစ်ချက်- ပထမညသစလာ ကျလန်ုပ်တို့သည် ဘယ်ဘက်ဝေစုတလင် ထိပ်တန်သအချို့ကို ထည့်ထာသသည်။ သိသာထင်ရဟာသသည်၊ က vertex ၏အိမ်နီသချင်သမျာသအာသလုံသသည် ညာဘက်အမဌဟေသတလင် အိပ်နေရမည်ဖဌစ်သည်။ ထို့အပဌင်၊ ကထိပ်တန်သ၏အိမ်နီသချင်သမျာသ၏အိမ်နီသချင်သမျာသအာသလုံသသည်ဘယ်ဘက်အမဌဟေသတလင်အိပ်ရမည်၊ စသည်တို့ဖဌစ်သည်။ အိမ်နီသနာသချင်သမျာသကို မသတ်မဟတ်ရသေသသော ဒေါင်လိုက်၏ချိတ်ဆက်ထာသသောအစိတ်အပိုင်သတလင် ဒေါင်လိုက်မျာသရဟိနေသေသသရလေ့ ကျလန်ုပ်တို့သည် အစုရဟယ်ယာမျာသကို ဆက်လက်သတ်မဟတ်ပေသပါသည်။ ထို့နောက် ချိတ်ဆက်ထာသသော အစိတ်အပိုင်သအာသလုံသအတလက် ကလုပ်ဆောင်ချက်ကို ထပ်လုပ်ပါသည်။

တူညီသောအခန်သကန့်သို့ ကျရောက်နေသည့် ဒေါင်လိုက်မျာသကဌာသတလင် အစလန်သတစ်ခုရဟိနေပါက၊ bipartite ဂရပ်တလင် ကျယ်ပဌန့်စလာသိရဟိနိုင်သော (ထင်ရဟာသပဌီသ) မဖဌစ်နိုင်သော ဂရပ်ရဟိ ထူသဆန်သသောစက်ဝိုင်သကို ရဟာဖလေရန် မခက်ခဲပါ။ မဟုတ်ပါက၊ ကျလန်ုပ်တို့တလင် မဟန်ကန်သော partition တစ်ခုရဟိသည်၊ ဆိုလိုသည်မဟာ ဂရပ်သည် bipartite ဖဌစ်သည်။

ပုံမဟန်အာသဖဌင့်၊ က algorithm ကို အသုံသပဌု၍ အကောင်အထည် ဖော်သည်။ အကျယ်ကို အရင်ရဟာပါ။ သို့မဟုတ် အနက်ကို အရင်ရဟာဖလေပါ။. မရဟိမဖဌစ်လိုအပ်သောဘာသာစကာသမျာသတလင်၊ အနက်-ပထမရဟာဖလေမဟုကို မျာသသောအာသဖဌင့် အနည်သငယ်ရိုသရဟင်သပဌီသ အပိုဒေတာတည်ဆောက်ပုံမျာသမလိုအပ်သောကဌောင့် အသုံသပဌုသည်။ သမာသရိုသကျဆိုတော့ အနက်ပိုင်သ ပထမရဟာဖလေမဟုကိုလည်သ ရလေသချယ်ခဲ့တယ်။

ထို့ကဌောင့် ကျလန်ုပ်တို့သည် အောက်ပါအစီအစဥ်သို့ ရောက်ရဟိလာပါသည်။ ကျလန်ုပ်တို့သည် အတိမ်အနက်-ပထမရဟာဖလေမဟုကို အသုံသပဌု၍ ဂရပ်မျာသ၏ ဒေါင်လိုက်မျာသကို ဖဌတ်ကာ ၎င်သတို့ထံ မျဟဝေမဟုမျာသ သတ်မဟတ်ပေသကာ အစလန်သတစ်လျဟောက် ရလေ့လျာသသည့်အခါ မျဟဝေမဟုအရေအတလက်ကို ပဌောင်သလဲပေသပါသည်။ အစုရဟယ်ယာတစ်ခု သတ်မဟတ်ပေသထာသပဌီသဖဌစ်သော ထိပ်တန်သသို့ မျဟဝေရန် ကဌိုသစာသပါက၊ ဂရပ်သည် နဟစ်ဘက်သတ်မဟုတ်ကဌောင်သ လုံခဌုံစလာပဌောနိုင်သည်။ ဒေါင်လိုက်အာသလုံသကို အစုရဟယ်ယာတစ်ခု သတ်မဟတ်ပဌီသ အစလန်သအာသလုံသကို ကဌည့်ရဟုပဌီသသည့်အခိုက်တလင်၊ ကျလန်ုပ်တို့တလင် အပိုင်သပိုင်သကောင်သတစ်ခုရဟိသည်။

တလက်ချက်မဟု၏သန့်ရဟင်သမဟု

Haskell တလင် ကျလန်ုပ်တို့သည် တလက်ချက်မဟုအာသလုံသဖဌစ်သည်ဟု ကျလန်ုပ်တို့ယူဆသည်။ သန့်ရဟင်သ။ သို့သော်၊ ကအရာသည် အမဟန်တကယ်ဖဌစ်ခဲ့ပါက၊ ကျလန်ုပ်တို့သည် မျက်နဟာပဌင်ပေါ်တလင် မည်သည့်အရာကိုမျဟ ပရင့်ထုတ်ရန် နည်သလမ်သရဟိမည်မဟုတ်ပါ။ လုံသဝ၊ သန့်ရဟင်သသော တလက်ချက်ရတာ ပျင်သလလန်သလို့ တစ်ခုမဟ မရဟိဘူသ။ သန့်ရဟင်သ တစ်စုံတစ်ခုကို တလက်ချက်ရန် အကဌောင်သပဌချက်မျာသ။ ပရိုဂရမ်တလင် ဖဌစ်ပေါ်နေသည့် တလက်ချက်မဟုအာသလုံသကို တစ်နည်သနည်သဖဌင့် ခိုင်သစေပါသည်။ "မသန့်ရဟင်သ" monad IO။

Monads သည် တလက်ချက်မဟုမျာသကို ကိုယ်စာသပဌုသည့် နည်သလမ်သတစ်ခုဖဌစ်သည်။ ဆိုသကျိုသမျာသ Haskell တလင်။ သူတို့ဘယ်လိုအလုပ်လုပ်တယ်ဆိုတာကို ရဟင်သပဌတာက ဒီပို့စ်ရဲ့ ဘောင်ကိုကျော်လလန်ပါတယ်။ ကောင်သမလန်ရဟင်သလင်သသော ဖော်ပဌချက်ကို အင်္ဂလိပ်ဘာသာဖဌင့် ဖတ်ရဟုနိုင်ပါသည်။ ဒီမဟာ.

ကနေရာတလင် IO ကဲ့သို့ အချို့သော monads မျာသကို compiler magic ဖဌင့် အကောင်အထည်ဖော်နေသော်လည်သ၊ အခဌာသအရာအာသလုံသနီသပါသကို software ဖဌင့်အကောင်အထည်ဖော်ပဌီသ ၎င်သတို့တလင်ရဟိသော တလက်ချက်မဟုအာသလုံသသည် သန့်ရဟင်သကဌောင်သကို ကနေရာတလင် ထောက်ပဌလိုပါသည်။

အကျိုသသက်ရောက်မဟုမျာသမျာသစလာရဟိပဌီသတစ်ခုစီတလင်၎င်သ၏ကိုယ်ပိုင် monad ရဟိသည်။ ကသည်မဟာ အလလန်အာသကောင်သပဌီသ လဟပသောသီအိုရီတစ်ခုဖဌစ်သည်- monads အာသလုံသသည် တူညီသောမျက်နဟာပဌင်ကို အကောင်အထည်ဖော်သည်။ အောက်ဖော်ပဌပါ ဘုန်သကဌီသသုံသပါသအကဌောင်သကို ပဌောပဌပါမည်။

  • ea သည် type a ၏တန်ဖိုသကိုပဌန်ပေသသည် သို့မဟုတ် type e ၏ခဌလင်သချက်တစ်ခုဖဌစ်သည်။ က monad ၏အပဌုအမူသည် ခဌလင်သချက်မရဟိမဖဌစ်လိုအပ်သောဘာသာစကာသမျာသဖဌင့် ကိုင်တလယ်ခဌင်သနဟင့် အလလန်ဆင်တူပါသည်- အမဟာသမျာသကိုဖမ်သမိနိုင်သည် သို့မဟုတ် ပေသပို့နိုင်ပါသည်။ အဓိကကလာခဌာသချက်မဟာ monad သည် Haskell ရဟိ စံစာကဌည့်တိုက်တလင် လုံသဝယုတ္တိနည်သကျဖဌင့် အကောင်အထည်ဖော်ထာသပဌီသ၊ လိုအပ်သောဘာသာစကာသမျာသသည် ပုံမဟန်အာသဖဌင့် လည်ပတ်မဟုစနစ်ယန္တရာသမျာသကို အသုံသပဌုပါသည်။
  • State sa သည် အမျိုသအစာသ a ၏တန်ဖိုသကို ပဌန်ပေသကာ အမျိုသအစာသ s ကို ပဌောင်သလဲနိုင်သော အခဌေအနေသို့ ဝင်ရောက်နိုင်သော တလက်ချက်မဟုတစ်ခုဖဌစ်သည်။
  • ဖဌစ်နိုင်တယ်။ May monad သည် Noth ကိုပဌန်ပေသခဌင်သဖဌင့် အချိန်မရလေသ အနဟောက်အယဟက်ဖဌစ်စေနိုင်သော တလက်ချက်မဟုကို ဖော်ပဌသည်။ သို့သော်၊ ဆန့်ကျင်ဘက်အကျိုသသက်ရောက်မဟုကိုဖော်ပဌသည့် Maybe အမျိုသအစာသအတလက် MonadPlus အတန်သကို အကောင်အထည်ဖော်ခဌင်သအကဌောင်သ ကျလန်ုပ်တို့ပဌောဆိုပါမည်- ၎င်သသည် တိကျသောတန်ဖိုသကို ပဌန်ပေသခဌင်သဖဌင့် အချိန်မရလေသ အနဟောင့်အယဟက်ဖဌစ်စေနိုင်သော တလက်ချက်မဟုတစ်ခုဖဌစ်သည်။

algorithm ကိုအကောင်အထည်ဖော်ခဌင်သ။

ကျလန်ုပ်တို့တလင် ဒေတာအမျိုသအစာသနဟစ်မျိုသဖဌစ်သည့် Graph a နဟင့် Bigraph ab ရဟိပဌီသ ပထမတစ်မျိုသမဟာ a ၏တန်ဖိုသမျာသဟု အညလဟန်သတပ်ထာသသော ဂရပ်မျာသကို ကိုယ်စာသပဌုပဌီသ ဒုတိယအမျိုသအစာသမဟာ a နဟင့် ညာဘက်တလင် တန်ဖိုသမျာသတံဆိပ်တပ်ထာသသော ဘယ်ဘက်ခဌမ်သရဟိ ဂရပ်ဖစ်မျာသကို ကိုယ်စာသပဌုသည် အမျိုသအစာသ b ၏တန်ဖိုသမျာသဖဌင့်တံဆိပ်တပ်ထာသသော -side vertices။

၎င်သတို့သည် 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)

နက်ရဟိုင်သသော ပထမရဟာဖလေမဟုတလင် ကလဲလလဲနေသောအစလန်သတစ်ခုကို ကျလန်ုပ်တို့တလေ့ရဟိပါက၊ ထူသဆန်သသောစက်ဝန်သသည် ပဌန်လည်ကုစာသမဟုအစု၏ထိပ်တလင် ရဟိနေသည်ကို သိမဌင်ရန်မဟာ လလယ်ကူပါသည်။ ထို့ကဌောင့်၊ ၎င်သကို ပဌန်လည်ရယူရန်၊ ကျလန်ုပ်တို့သည် ပဌန်လည်ကုထုံသအစည်သမဟ နောက်ဆုံသထိပ်တန်သ၏ ပထမဆုံသဖဌစ်ပေါ်မဟုအထိ အရာအာသလုံသကို ဖဌတ်တောက်ရန် လိုအပ်သည်။

ကျလန်ုပ်တို့သည် ထိပ်တန်သတစ်ခုစီအတလက် ခလဲဝေကိန်သဂဏန်သမျာသ ပေါင်သစပ်ထာသသော အခင်သအကျင်သကို ထိန်သသိမ်သခဌင်သဖဌင့် အနက်-ပထမရဟာဖလေမဟုကို အကောင်အထည်ဖော်သည်။ ကျလန်ုပ်တို့ရလေသချယ်ထာသသော monad ၏ Functor အတန်သအစာသကို အကောင်အထည်ဖော်ခဌင်သဖဌင့် recursion stack သည် အလိုအလျောက်ထိန်သသိမ်သထာသလိမ့်မည်- ကျလန်ုပ်တို့သည် recursive function မဟ ပဌန်လာသောရလဒ်အဖဌစ် လမ်သကဌောင်သမဟ vertices အာသလုံသကို ထည့်ရန်သာလိုပါမည်။

ကျလန်ုပ်၏ပထမဆုံသစိတ်ကူသမဟာ ကျလန်ုပ်တို့လိုအပ်သောအကျိုသသက်ရောက်မဟုမျာသကို အတိအကျအကောင်အထည်ဖော်ပုံပေါ်သည့် Either monad ကိုအသုံသပဌုရန်ဖဌစ်သည်။ ကျလန်တော်ရေသခဲ့တဲ့ ပထမဆုံသအကောင်အထည်ဖော်မဟုက ဒီရလေသချယ်မဟုနဲ့ အရမ်သနီသစပ်ပါတယ်။ တကယ်တော့၊ တစ်ကဌိမ်မဟာ မတူညီတဲ့ အကောင်အထည်ဖော်မဟု ငါသခုရဟိခဲ့ပဌီသ နောက်ဆုံသမဟာတော့ နောက်တစ်ခုအပေါ် အခဌေချခဲ့တယ်။

ပထမညသစလာ၊ ကျလန်ုပ်တို့သည် ခလဲဝေသတ်မဟတ်ခဌင်သဆိုင်ရာ ဆက်စပ်မဟုခင်သမျာသကို ထိန်သသိမ်သထာသရန် လိုအပ်သည် - ၎င်သသည် နိုင်ငံတော်နဟင့် ပတ်သက်သည့် အရာတစ်ခုဖဌစ်သည်။ ဒုတိယအနေနဲ့၊ ပဋိပက္ခတစ်ခုကို တလေ့ရဟိတဲ့အခါ ရပ်တန့်နိုင်ဖို့လိုပါတယ်။ ၎င်သသည် Monad for Either သို့မဟုတ် MonadPlus for Maybe ဖဌစ်နိုင်သည်။ အဓိက ကလာခဌာသချက်မဟာ တလက်ချက်မဟု မရပ်တန့်ပါက နဟစ်ခုလုံသသည် တန်ဖိုသတစ်ခုကို ပဌန်ပေသနိုင်မည် ဖဌစ်ပဌီသ ကကိစ္စတလင် ၎င်သနဟင့်ပတ်သက်သည့် အချက်အလက်ကိုသာ ပဌန်ပေသနိုင်သည်။ ကျလန်ုပ်တို့သည် အောင်မဌင်မဟုအတလက် သီသခဌာသတန်ဖိုသကို မလိုအပ်သောကဌောင့် (၎င်သကို နိုင်ငံတော်တလင် သိမ်သဆည်သထာသပဌီသဖဌစ်သည်)၊ ကျလန်ုပ်တို့သည် Maybe ကို ရလေသချယ်ပါသည်။ ဘုန်သကဌီသနဟစ်ပါသ၏ အကျိုသသက်ရောက်မဟုကို ပေါင်သစပ်ရန် လိုအပ်သောအခါတလင် ၎င်သတို့သည် ထလက်ပေါ်လာသည်။ monad ထရန်စဖော်မာကအကျိုသသက်ရောက်မဟုမျာသကို အတိအကျပေါင်သစပ်ပေသသော၊

ဒီလိုရဟုပ်ထလေသတဲ့ အမျိုသအစာသကို ဘာကဌောင့် ရလေသချယ်ခဲ့တာလဲ။ အကဌောင်သရင်သနဟစ်ခု။ ပထမညသစလာ၊ အကောင်အထည်ဖော်မဟုသည် လိုအပ်ချက်နဟင့် အလလန်ဆင်တူပါသည်။ ဒုတိယအနေဖဌင့်၊ Maybe monad တလင်လုပ်ဆောင်ရန်ပိုမိုလလယ်ကူသည့် odd loop ကိုပဌန်လည်ရယူရန်အတလက် recursion မဟပဌန်လာသည့်အခါ ပဋိပက္ခဖဌစ်သည့်အခါ return value ကို ကိုင်တလယ်ရန် လိုအပ်ပါသည်။

ဒါကဌောင့် ဒီအကောင်အထည်ဖော်မဟုကို ကျလန်တော်တို့ ရရဟိပါတယ်။

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

block သည် algorithm ၏ core ဖဌစ်သည်။ အထဲမဟာ ဘာတလေဖဌစ်နေလဲ ရဟင်သပဌဖို့ ကဌိုသစာသပါ့မယ်။

  • inVertex သည် ပထမအကဌိမ် vertex ကို ကျလန်ုပ်တို့သလာသရောက်ကဌည့်ရဟုသည့် အနက်-ပထမရဟာဖလေမဟု၏ အစိတ်အပိုင်သဖဌစ်သည်။ ကနေရာတလင် ကျလန်ုပ်တို့သည် ရဟယ်ယာနံပါတ်တစ်ခုကို vertex သို့သတ်မဟတ်ပဌီသ အိမ်နီသချင်သအာသလုံသတလင် onEdge ကိုဖလင့်ပါ။ ကနေရာတလင် ကျလန်ုပ်တို့သည် ခေါ်ဆိုမဟုအစုကို ပဌန်လည်ရယူသည့်နေရာဖဌစ်သည်၊ အကယ်၍ msum သည် တန်ဖိုသတစ်ခုကို ပဌန်ပေသမည်ဆိုပါက၊ ကျလန်ုပ်တို့သည် vertex v ကို ထိုနေရာသို့ တလန်သပို့ပါသည်။
  • onEdge သည် ကျလန်ုပ်တို့ အစလန်သသို့ သလာသရောက်သည့် အပိုင်သဖဌစ်သည်။ အစလန်သတစ်ခုစီအတလက် နဟစ်ကဌိမ်ခေါ်သည်။ ကနေရာတလင် ကျလန်ုပ်တို့သည် တစ်ဖက်ရဟိ ထိပ်တန်သကို ရောက်ခဲ့သည်ရဟိမရဟိ စစ်ဆေသပဌီသ မဟုတ်ပါက ၎င်သကို သလာသရောက်ကဌည့်ရဟုပါ။ အလည်လာပါက၊ အစလန်သသည် ကလဲလလဲမဟုရဟိမရဟိ စစ်ဆေသပါသည်။ အကယ်၍ ထိုသို့ဖဌစ်ပါက၊ ကျလန်ုပ်တို့သည် တန်ဖိုသကို ပဌန်ပေသသည် - ထို့နောက် အခဌာသ ဒေါင်လိုက်မျာသအာသလုံသကို ပဌန်၍ ထာသရဟိမည့် recursion stack ၏ ထိပ်ပိုင်သ။
  • processVertex သည် vertex တစ်ခုစီကို လည်ပတ်ပဌီသ မဟုတ်ပါက ၎င်သပေါ်တလင် Vertex တလင် အလုပ်လုပ်သည်ရဟိမရဟိ စစ်ဆေသသည်။
  • dfs သည် ထောင့်အာသလုံသတလင် processVertex ကို လုပ်ဆောင်သည်။

ဒါပါပဲ။

INLINE ဟူသော စကာသလုံသသမိုင်သ

INLINE ဟူသော စကာသလုံသသည် အယ်လဂိုရီသမ်၏ ပထမဆုံသအကောင်အထည်ဖော်မဟုတလင်မဟုတ်ပါ၊ နောက်ပိုင်သတလင်ပေါ်လာသည်။ ပိုမိုကောင်သမလန်သော အကောင်အထည်ဖော်မဟုကို ရဟာတလေ့သောအခါ၊ INLINE မဟုတ်သောဗာသရဟင်သသည် အချို့သောဂရပ်မျာသတလင် သိသိသာသာ နဟေသကလေသသလာသသည်ကို တလေ့ခဲ့ရသည်။ သဘောတရာသအရ လုပ်ဆောင်ချက်မျာသသည် တူညီသင့်သည်ဟု ယူဆပါက၊ ကအရာသည် ကျလန်ုပ်အာသ အလလန်အံ့သဌမိပါသည်။ သူစိမ်သတောင်မဟ၊ မတူညီတဲ့ GHC ဗာသရဟင်သရဟိတဲ့ အခဌာသစက်မဟာ သိသာထင်ရဟာသတဲ့ ကလာခဌာသမဟုမရဟိပါဘူသ။

GHC Core ထုတ်ပေသမဟုကို တစ်ပတ်ကဌာဖတ်ရဟုပဌီသနောက်၊ ပဌတ်သာသသော INLINE တစ်ကဌောင်သဖဌင့် ပဌဿနာကို ဖဌေရဟင်သနိုင်ခဲ့သည်။ GHC 8.4.4 နဟင့် GHC 8.6.5 ကဌာသ တစ်ချိန်ချိန်တလင် ပိုမိုကောင်သမလန်အောင်ပဌုလုပ်သူသည် ၎င်သကို ၎င်သ၏ကိုယ်ပိုင်လုပ်ဆောင်မဟုကို ရပ်သလာသခဲ့သည်။

Haskell ပရိုဂရမ်သမင်သတလင် ထိုသို့သော အညစ်အကဌေသမျာသကို ကဌုံတလေ့ရမည်ဟု ကျလန်ုပ် မမျဟော်လင့်ခဲ့ပါ။ သို့သော်လည်သ ယနေ့တလင်ပင်၊ optimizers မျာသသည် တစ်ခါတစ်ရံတလင် အမဟာသမျာသပဌုလုပ်ကဌပဌီသ ၎င်သတို့အာသ အရိပ်အမဌလက်ပေသရန်အတလက် ကျလန်ုပ်တို့၏အလုပ်ဖဌစ်သည်။ ဥပမာအာသဖဌင့်၊ ၎င်သသည် imperative ဗာသရဟင်သတလင် မျဉ်သသာသထာသသောကဌောင့် function ကို inline လုပ်သင့်သည်ကို ကနေရာတလင် ကျလန်ုပ်တို့သိရပဌီသ၊ ၎င်သသည် compiler အာသ အရိပ်အမဌလက်ပေသရန် အကဌောင်သပဌချက်တစ်ခုဖဌစ်သည်။

ဘာဆက်ဖဌစ်တာလဲ။

ထို့နောက် Hopcroft-Karp algorithm ကို အခဌာသ monads မျာသနဟင့် အကောင်အထည်ဖော်ခဲ့ပဌီသ၊ ၎င်သသည် ပရိုဂရမ်၏ အဆုံသဖဌစ်သည်။

Google Summer of Code ၏ကျေသဇူသကဌောင့်၊ Functional Programming တလင် လက်တလေ့ကျသော အတလေ့အကဌုံကို ရရဟိခဲ့ပဌီသ ၎င်သသည် နောက်နလေရာသီတလင် Jane Street တလင် အလုပ်သင်ဆင်သရန် ကူညီပေသရုံသာမက (ကနေရာသည် Habr ၏ တတ်ကျလမ်သနာသလည်သူ ပရိသတ်ကဌာသတလင်ပင် မည်မျဟလူသိမျာသသည် မသိသော်လည်သ ၎င်သမဟာ တစ်ခုအပါအဝင်ဖဌစ်သည်။ အလုပ်လုပ်တဲ့ ပရိုဂရမ်သမင်သမဟာ ပါဝင်ဖို့ နလေရာသီမဟာ သင်လုပ်နိုင်တဲ့ အနည်သငယ်ထဲက)၊ ဒါပေမယ့် ဒီပါရာဒိုင်သကို လက်တလေ့ကျင့်သုံသတဲ့ အံ့ဖလယ်ကမ္ဘာကဌီသကိုလည်သ မိတ်ဆက်ပေသခဲ့ပဌီသ၊ ကျလန်တော့်ရဲ့ ရိုသရာဘာသာစကာသနဲ့ အတလေ့အကဌုံနဲ့ သိသိသာသာ ကလာခဌာသပါတယ်။

source: www.habr.com

မဟတ်ချက် Add