ফাংশনাল প্রোগ্রামিংয়ে কলা বিভাজন এবং ফিউশন কী?


22

আমার বিশ্ববিদ্যালয়ের কোর্সে এই পদগুলি উল্লেখ করা হয়েছে। দ্রুত গুগলিং আমাকে কয়েকটি বিশ্ববিদ্যালয়ের কাগজপত্রের দিকে ইঙ্গিত করেছিল, তবে আমি একটি সহজ ব্যাখ্যা খুঁজছি।


@ জোজেফগ: আপনার পোস্টের লিঙ্কের জন্য ধন্যবাদ। এটি সম্পর্কে একটি প্রশ্ন। বাক্যে "এই অর্থে একটি বীজগণিত হ'ল একটি বস্তুর সি, এবং একটি মানচিত্র FC → C" এর একটি জুটি, সি কি আসলেই একটি অবজেক্ট, বা বরং কোনও বিভাগ বলে মনে হয়? অন্য কথায়, আমি নিশ্চিত নই যদি এফ কোনও শ্রেণীর কোনও ফান্টরকে চিহ্নিত করে, এবং এফ-বীজগণিতগুলি সেই ফান্টারের দ্বারা প্ররোচিত বীজগণিত হয়, যদি এফ নিজেই কোনও বস্তুর থেকে নির্দিষ্ট তীর হয়।
জর্জিও

Cএটি কোনও বিভাগের একটি বস্তু (বলা যাক CC), Fএটি একটি ফান্টেক্টর থেকে CC -> CCতাই এটি নিজের মধ্যে CCআবার মানচিত্র করে। F CC -> CCবিভাগে এখন কেবল একটি সাধারণ তীর CC। সুতরাং একটি Fবীজগণিত একটি বস্তুর C : CCএবং একটি তীর F C -> Cমধ্যেCC
ড্যানিয়েল Gratzer

উত্তর:


4

যদিও ইতিমধ্যে 2 টি উত্তর সরবরাহ করা হয়েছে, আমি মনে করি না "কলা বিভাজন" এখানে এখানে ব্যাখ্যা করা হয়েছে।

এটি প্রকৃতপক্ষে "কলা, লেন্স, খাম এবং কাঁটাতারের সাথে কারিকাল প্রোগ্রামিংয়ে সংজ্ঞায়িত হয়েছে, এরিক মাইজার মার্টেন ফোকিংকা, রস প্যাটারসন, 1991"; এই নিবন্ধটি স্কুইগল এর অত্যধিক ব্যবহারের কারণে (আমার জন্য) পড়া কঠিন। যাইহোক, "সার্বজনীনতা এবং ভাঁজটির ভাবাবেগ সম্পর্কিত একটি টিউটোরিয়াল, গ্রাহাম হাটন, 1999" এর একটি সংজ্ঞা রয়েছে যা পার্স করা সহজ:

টিপলস তৈরি করতে ভাঁজ ব্যবহারের সাধারণ উদাহরণ হিসাবে , ফাংশনের সার্বিক দৈর্ঘ্য বিবেচনা করুন যা সংখ্যার তালিকার যোগফল এবং দৈর্ঘ্য গণনা করে :

sumlength :: [Int] → (Int,Int)
sumlength xs = (sum xs, length xs)

ফাংশন সংজ্ঞা একটি সহজবোধ্য সমাহার দ্বারা সমষ্টি এবং দৈর্ঘ্য ব্যবহার ভাঁজ আগের দেওয়া, ফাংশন sumlength একটি একক অ্যাপ্লিকেশন হিসেবে পুনরায় সংজ্ঞায়িত করা যেতে পারে ভাঁজ করে সংখ্যার একটি তালিকা থেকে নম্বর একজোড়া উত্পন্ন:

sumlength = fold (λn (x, y) → (n + x, 1 + y)) (0, 0)

এই সংজ্ঞাটি মূল সংজ্ঞাটির চেয়ে বেশি দক্ষ, কারণ এটি দুটি পৃথক ট্র্যাভারসালকে না দিয়ে কেবল যুক্তি তালিকার উপরে একক ট্র্যাভার্সাল তৈরি করে। এই উদাহরণ থেকে Generalising, অ্যাপ্লিকেশন কোন যুগল ভাঁজ একই তালিকা সবসময় একটি একক আবেদন দিতে মিলিত হতে পারে ভাঁজ যে একজোড়া উত্পন্ন, 'কলার খোসা' তথাকথিত সম্পত্তির মর্মস্পর্শী দ্বারা ভাঁজ (Meijer, 1992) । এই সম্পত্তির অদ্ভুত নামটি এই সত্য থেকে উদ্ভূত হয় যে ফোল্ডার অপারেটরটি কখনও কখনও কলের অনুরূপ বন্ধনী (| |) ব্যবহার করে লেখা হয় এবং জোড় অপারেটরটিকে কখনও কখনও বিভাজনও বলা হয়। সুতরাং, তাদের সংমিশ্রণ কলা বিভক্ত হিসাবে অভিহিত করা যেতে পারে!


19

সুতরাং এটি আসলে মাইজার এবং " কলা, লেন্স, খাম এবং কাঁটাতারের সাথে ফাংশনাল প্রোগ্রামিং " নামে পরিচিত কয়েকজনের একটি গবেষণাপত্রের মূল উল্লেখ, মূল ধারণাটি হ'ল আমরা যে কোনও পুনরাবৃত্ত তথ্য টাইপ নিতে পারি, যেমন বলা যায়

 data List = Cons Int List | Nil

এবং আমরা একটি ধরণের পরিবর্তনশীল মধ্যে পুনরাবৃত্তি ফ্যাক্টর করতে পারেন

 data ListF a = Cons Int a | Nil

কেন আমি যুক্ত করেছি Fকারণ এটি এখন একটি ফান্টেক্টর! এটি আমাদের তালিকাগুলি নকল করতে দেয় তবে একটি মোড় দিয়ে: তালিকা তৈরি করতে আমাদের তালিকার ধরণটি বাসাতে হয়

type ThreeList = ListF (ListF (ListF Void)))

আমাদের মূল তালিকা পুনরুদ্ধার করার জন্য আমরা এই পাখির রাখা প্রয়োজন অসীম । এটি আমাদের একটি টাইপ দেয় ListFFযেখানে

  ListF ListFF == ListFF

এটি করার জন্য একটি "নির্দিষ্ট পয়েন্ট টাইপ" সংজ্ঞায়িত করুন

  data Fix f = Fix {unfix :: f (Fix f)}
  type ListFF = Fix ListF

অনুশীলন হিসাবে, আপনার এটি আমাদের উপরের সমীকরণটিকে সন্তুষ্ট করে যাচাই করা উচিত ow

  type ListAlg a = ListF a -> a

ListAlgগুলি হল "তালিকার বীজগণিত" প্রকার, এবং আমরা একটি নির্দিষ্ট ফাংশন সংজ্ঞায়িত করতে পারি

  cata :: ListAlg a -> ListFF -> a
  cata f = f . fmap (cata f) . unfix

আরও

  cata :: ListAlg a -> ListFF -> a
  cata :: (Either () (Int, a) -> a) -> ListFF -> a
  cata :: (() -> a) -> ((Int, a) -> a) -> ListFF -> a
  cata :: a -> (Int -> a -> a) -> ListFF -> a
  cata :: (Int -> a -> a) -> a -> [Int] -> a

চেনা চেনা? cataঠিক ডান ভাঁজ হিসাবে একই!

সত্যিই মজার বিষয় হ'ল আমরা কেবল তালিকার তালিকাগুলির চেয়ে বেশি এটি করতে পারি, যে কোনও ধরণের এই " cataফান্টারের স্থির বিন্দু" দিয়ে সংজ্ঞায়িত একটি রয়েছে এবং সেগুলি সংযুক্ত করার জন্য আমাদের কেবলমাত্র স্বাক্ষরের শিথিল করতে হবে

  cata :: (f a -> a) -> Fix f -> a

এটি আসলে বিভাগের থিয়োরির একটি অংশ থেকে অনুপ্রাণিত হয়েছিল যা আমি লিখেছিলাম , তবে এটি হ্যাস্কেল পক্ষের মাংস।


2
এটি কি উল্লেখযোগ্য যে কলাগুলি (| |) বন্ধনীগুলি যা মূল কাগজটি ক্যাটা
জেকে

7

যদিও জোজেফগ একটি উত্তর সরবরাহ করেছে, তবে আমি নিশ্চিত নই যে এটির প্রশ্নের উত্তর দিয়েছে কিনা। "ফিউশন আইন" নীচের কাগজে ব্যাখ্যা করা হয়েছে:

গ্রাহাম হটন, 1999 এর সর্বজনীনতা এবং ভাঁজটির ভাবগামিতা সম্পর্কে একটি টিউটোরিয়াল

মূলত এটি বলে যে কিছু অবস্থার অধীনে আপনি কোনও ফাংশনের সংমিশ্রণকে ("ফিউজ") একত্রিত করতে পারেন এবং একক ভাগে ভাঁজ করতে পারেন, তাই মূলত

h · fold gw = ভাঁজ এফভি

এই সমতার জন্য শর্তগুলি

hw = v
h (gxy) = fx (hy)

"কলা বিভক্ত" বা "কলা বিভক্ত আইন" নিবন্ধটি থেকে

কলা, লেন্স, খাম এবং কাঁটাতারের সাথে ক্রিয়ামূলক প্রোগ্রামিং, এরিক মাইজার মার্টেন ফোকিংকা, রস প্যাটারসন, 1991

দুর্ভাগ্যক্রমে নিবন্ধটি বোঝা খুব কঠিন কারণ এটি বার্ড – মের্টেনস ফর্মালিজম ব্যবহার করে যাতে আমি এর মাথা বা লেজ তৈরি করতে পারি না। যতদূর আমি "কলা বিভাজন আইন" বুঝতে পেরেছি এটি বলছে যে আপনার যদি একই যুক্তিতে 2 টি ভাঁজ অপারেটিং থাকে তবে সেগুলি একক ভাগে মিশে যেতে পারে।

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