কলসিসি দিয়ে আমি কী করব যা কনট দিয়ে করা যায় না?


9

আমি সত্যিই কলসিসি বোঝার সাথে লড়াই করছি। আমি ধারাবাহিকতার শক্তি পেয়েছি এবং আমার কিছু প্রকল্পে ধারণাটি ব্যবহার করে শীতল ধারণা তৈরি করেছি। তবে কখনই আমার চেয়ে বেশি ক্ষমতা সহ কিছু ব্যবহার করার দরকার পড়েনি cont :: ((a->r)->r)-> Cont r a

এটি ব্যবহারের পরে, তারা কেন কনট মোনাডকে সমস্ত মনাদের মাতৃভাষা, YET বলে ডাকে তা অনেকটা বোঝায় callCCএবং এটি আমার প্রশ্নটি ঠিক কখনই আসে না that's


আপনি কিভাবে ব্যবহার করেছেন Cont? আপনি যখন বলছেন contযে এর চেয়ে শক্তিশালী কিছু ব্যবহার করার দরকার নেই, তার অর্থ কি আপনি ব্যবহার করেন নি resetবা shiftহয় না?
কেএ বুহর

আমি ব্যবহার করিনি resetবা shift। আমি এটি এম্বেড এম্বেডেড ভাষা সংজ্ঞায়িত করতে ব্যবহার করেছি যা প্রদত্ত ক্রিয়াকে অন্য প্রক্রিয়া দ্বারা সমাধান না করা পর্যন্ত স্থগিত করা যায় এবং তারপরে প্রদত্ত "ধারাবাহিকতা" দিয়ে এটি পুনরায় শুরু হয়। আমি কনট মোনাডের সাথে প্রচুর অভিজ্ঞতা অর্জনের ধারণাটি দিয়েছি তবে এতটা সত্য নয়, আমি সত্যিই কলসিসি বুঝতে চাই
আলেজান্দ্রো নাভাস

উত্তর:


10

callCC আপনাকে "প্রারম্ভিক রিটার্ন" শব্দার্থবিজ্ঞান দেয়, তবে একান্ত প্রসঙ্গে।

বলুন যে আপনি চেয়েছিলেন doOne, এবং যদি এটি ফিরে আসে True, আপনি তত্ক্ষণাত্ বন্ধ করে দিন, অন্যথায় আপনি যান doTwoএবং doThree:

doOne :: Cont r Bool
doTwo :: Cont r ()
doThree :: Cont r ()

doThings :: Cont r ()
doThings = do
    one <- doOne
    if one
        then pure ()
        else do
            doTwo
            doThree

দেখতে ifসেখানে শাখাবিন্যাস? একটি শাখা ততটা খারাপ নয়, মোকাবেলা করা যেতে পারে তবে ভাবুন এমন একাধিক পয়েন্ট রয়েছে যেখানে আপনি কেবল জামিন করতে চান? এটি খুব কুরুচিপূর্ণ হয় খুব দ্রুত।

আপনার সাথে callCC"প্রারম্ভিক রিটার্ন" থাকতে পারে: আপনি শাখা পয়েন্টে জামিন দেন এবং বাকী গণনা বাসাতে হবে না:

doThings = callCC \ret -> do
    one <- doOne
    when one $ ret ()
    doTwo
    doThree

পড়তে আরও অনেক মনোরম!

আরও গুরুত্বপূর্ণ বিষয়, যেহেতু retএখানে একটি বিশেষ বাক্য গঠন ( returnসি-জাতীয় ভাষায়) নেই, তবে অন্যগুলির মতো কেবল একটি মান, আপনি এটি অন্যান্য ফাংশনেও পাস করতে পারেন! এবং এই ফাংশনগুলি তারপরে "অ-স্থানীয় রিটার্ন" নামে পরিচিত যা সম্পাদন করতে পারে - যেমন তারা doThingsএকাধিক নেস্টেড কল থেকে এমনকি গণনা "থামাতে" পারে। উদাহরণস্বরূপ, আমি doOneএর ফলাফলটি পরীক্ষা করে আলাদা আলাদা ফাংশনে ফ্যাক্ট করতে পারি checkOne:

checkOne ret = do
    one <- doOne
    when one $ ret ()

doThings = callCC \ret -> do
    checkOne ret
    doTwo
    doThree

আমি এটা পাই! এবং bমূলত কেবল একটি ওয়াইল্ডকার্ড যাতে আপনি কলসিসি-তে আরও ধারাবাহিকতা শৃঙ্খলিত করতে পারেন। যাইহোক, একবার retপ্রয়োগ করা হলে, কল সিসি দ্বারা উত্পাদিত ধারাবাহিকতা যা কিছু রেখেছিল তা "ফিরে" আসবে ret। এটি বেশ দুর্গন্ধযুক্ত, তবুও বেশ স্মার্ট, তবুও অত্যন্ত শক্তিশালী আমি দেখতে পাচ্ছি না এমন জায়গাগুলি যেখানে এমন শক্তি ব্যবহার করা নুকের সাথে একটি মাছি মারার মতো নয়
আলেজান্দ্রো নাভাস

1
@ Caeus Glad আমি সাহায্য করতে পারি। আপনি যদি আমার উত্তর পছন্দ করেন তবে আপনি কি এটি গ্রহণ করার বিষয়টি বিবেচনা করবেন?
ফায়োডর সোইকিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.