কেন হাস্কেল ফান্টেক্টরগুলি কেবল তাদের টার্গেট বিভাগে প্রকারভেদ করেছে?


12

হাস্কেলে, ফান্টেক্টর টাইপক্লাস ফান্টেক্টরটি নীচে সংজ্ঞায়িত হয়েছে (উদাহরণস্বরূপ হাস্কেল উইকি দেখুন ):

class Functor (f :: * -> *) where
  fmap :: (a -> b) -> f a -> f b 

যতদূর আমি বুঝতে (অনুগ্রহ করে আমাকে সংশোধন যদি আমি ভুল বলছি), যেমন একটি functor শুধুমাত্র লক্ষ্য বিভাগ একটি বিভাগ একটি টাইপ কন্সট্রাকটর ব্যবহার করে নির্মিত, যেমন যেমন থাকতে পারে [], Maybe, অন্যদিকে ইত্যাদি, এক কোন বিভাগ থাকার functors বলে মনে করতে পারি কোনও ফান্টারের লক্ষ্য হিসাবে, যেমন সমস্ত হাস্কেল প্রকারের বিভাগ। উদাহরণস্বরূপ, Intকেবল Maybe Intবা নয়, কোনও ফান্টারের লক্ষ্য বিভাগে কোনও বস্তু হতে পারে [Int]

হাস্কেল ফান্টেক্টরগুলিতে এই বিধিনিষেধের জন্য অনুপ্রেরণা কী?


4
সরলতা? হাস্কেলের প্রথম শ্রেণীর ধরণের ফাংশন নেই তাই সমস্ত ফাংশনগুলি কেবলমাত্র টাইপ কনস্ট্রাক্টর।
ড্যানিয়েল গ্রেটজার

2
@ জোজেফগ: আমার অজ্ঞতা ক্ষমা করুন: "প্রথম শ্রেণির ধরণগুলি" কী কী?
জর্জিও

4
সুতরাং যে ফাংশন আমরা একটি fডান কাছাকাছি টস করছি ? এবং আপনার দৃশ্যে, fএকটি সাধারণ হাস্কেল ফাংশন এবং ম্যাপের প্রকারের মতো হওয়া উচিত। হাস্কেল-এ কেবলমাত্র * -> *টাইপ কনস্ট্রাক্টরকেই কেবল এমন জিনিস দেওয়ার অনুমতি দেওয়া হয় । ধরণের পরিবারগুলি আরও সাধারণ, তবে তাদের অবশ্যই সর্বদা সম্পূর্ণ প্রয়োগ করা উচিত
ড্যানিয়েল গ্রেটজার


@ জোজেফগ: আমি মাঝে মাঝে এই প্রশ্নটি সম্পর্কে বারবার চিন্তা করি। আমি মনে করি হাস্কেল সীমাবদ্ধতা ফান্ট্যাকারগুলির মত প্রকাশের ক্ষমতাকে প্রভাবিত করে না। উদাহরণস্বরূপ, ধরুন যে আমাদের কাছে এমন ফান্টর রয়েছে যা তালিকার ফ্যান্টারের কাছে আইসোমরফিক, তবে মানচিত্র তৈরি করে না, বলুন - ইনট -> [ইনট] তবে ইনট -> <কোনও টাইপ কনস্ট্রাক্টর ব্যবহার করে অভিনব টাইপ> তারপরে আমি অনুমান করি যে কেউ প্রমাণ করতে পারেন যে <অভিনব টাইপ কোনও প্রকারের কনস্ট্রাক্টর ব্যবহার করেই নয় [আইএনটি] এর আইসোমরফিক। সুতরাং কোনও ধরণের কন্সট্রাক্টর ব্যবহার করে সংজ্ঞায়িত অবজেক্টগুলি নির্বাচন করা কেবল সুবিধাজনক এবং অভিব্যক্তিগত শক্তিটিকে ত্যাগ করে না।
জর্জিও

উত্তর:


1

কোনও বাধা নেই! আমি যখন টাইপ কন্সট্রাক্টরদের জন্য বিভাগ-তাত্ত্বিক ভিত্তি শিখতে শুরু করি তখন এই বিষয়টি আমাকেও বিভ্রান্ত করেছিল। আমরা এটি পেতে হবে। তবে প্রথমে আমাকে কিছু বিভ্রান্তি দূর করতে দিন। এই দুটি উদ্ধৃতি:

এই জাতীয় ফান্টারের কাছে কেবলমাত্র টার্গেট বিভাগ হিসাবে টাইপ কনস্ট্রাক্টর ব্যবহার করে একটি বিভাগ তৈরি করা যেতে পারে

এবং

যে কোনও ফ্যাঙ্ক্টরকে কোনও ফান্টারের টার্গেট হিসাবে কোনও বিভাগ থাকা ফ্যাটারগুলি ভাবতে পারে, যেমন সমস্ত হাস্কেল প্রকারের বিভাগ

দেখান যে কোনও ফান্টেক্টর কী তা আপনি ভুল বোঝাচ্ছেন (বা খুব কমপক্ষে আপনি পরিভাষার অপব্যবহার করছেন)।

Functors না গঠন করা বিভাগ। একটি ফান্টেক্টর বিভাগগুলির মধ্যে ম্যাপিং । ফ্যাক্টরগুলি লক্ষ্য বিভাগে অবজেক্ট এবং মোর্ফিজমগুলিকে উত্স বিভাগে অবজেক্টস এবং মরফিজমগুলি (ধরণ এবং ফাংশন) এনে দেয়।

মনে রাখবেন যে এর অর্থ একটি ফান্টার আসলেই ম্যাপিংয়ের একটি জুড়ি : F_obj অবজেক্টগুলিতে ম্যাপিং এবং রূপকথনে ম্যাপিং এফ_মোর্ফ । হাস্কেল-তে, ফান্টিকারের অবজেক্ট অংশ F_obj টাইপ কনস্ট্রাক্টরের নাম (যেমন List), যখন মরফিজম অংশটি ফাংশন হয় fmap(এটি যেহেতু fmapআমরা কোনও প্রদত্ত অভিব্যক্তিতে উল্লেখ করছি যা সাজানোর জন্য হাস্কেল সংকলক পর্যন্ত )। সুতরাং, আমরা বলতে পারি না যে Listএটি একটি ফান্টেক্টর; শুধুমাত্র সংমিশ্রণ Listএবং fmapএকটি ফান্টেক্টর। তবুও, লোকেরা স্বরলিপি অপব্যবহার করে; প্রোগ্রামাররা Listএকটি ফান্টেক্টরকে কল করে , যখন বিভাগের তাত্ত্বিকরা ফান্টারের উভয় অংশকে বোঝাতে একই চিহ্ন ব্যবহার করে use

তদ্ব্যতীত, প্রোগ্রামিংয়ে, প্রায় সমস্ত ফান্ট্যাক্টরগুলি এন্ডোফান্টেক্টর , অর্থাত্ উত্স এবং লক্ষ্য বিভাগটি একই in আমাদের ভাষার সকল প্রকারের বিভাগ। এই বিভাগটি টাইপ করুন । একটি endofunctor এফ উপর প্রকার একটি টাইপ মানচিত্র টি অন্য ধরনের ফুলটাইম এবং একটি ফাংশন > এস - টি অন্য ফাংশন ফুলটাইম -> ফাঃ । এই ম্যাপিং অবশ্যই অবশ্যই ফান্টারের আইন মেনে চলবে।

Listউদাহরণ হিসাবে ব্যবহার করে : আমাদের কাছে টাইপ কনস্ট্রাক্টর List : Type -> Typeএবং একটি ফাংশন রয়েছে fmap: (a -> b) -> (List a -> List b)যা একসাথে ফান্টেক্টর গঠন করে। টি

পরিষ্কার করার জন্য একটি চূড়ান্ত বিষয় রয়েছে। লিখন পূর্ণসংখ্যার নতুন ধরণের তালিকা তৈরিList int করে না । এই ধরণের ইতিমধ্যে বিদ্যমান । এটি আমাদের বিভাগের টাইপের একটি বিষয় ছিল । এটি উল্লেখ করার সহজ উপায়।List Int

এখন, আপনি ভাবছেন যে কোনও ফান্ট্যাক্টর কেন, বলতে Intবা বলার জন্য কোনও ধরণের মানচিত্র তৈরি করতে পারে না String। কিন্তু এটা করতে পারেন! একজনকে কেবল পরিচয় ফান্টর ব্যবহার করতে হবে। যে কোনও বিভাগ সি এর জন্য , পরিচয় বর্ণনাকারী প্রতিটি বস্তুকে নিজের কাছে মানচিত্র এবং নিজেই মর্ফিজমকে মানচিত্র করে। এই ম্যাপিংটি ফান্টারের আইনগুলিকে সন্তুষ্ট করে যাচাই করা সহজবোধ্য। হাসকেলে, এটি এমন এক প্রকার নির্মাতা হবে id : * -> *যা প্রতিটি ধরণের নিজের কাছে মানচিত্র করে। উদাহরণস্বরূপ, id intমূল্যায়ন int

তদ্ব্যতীত , কেউ এমনকী ধ্রুবক ফান্টেক্টর তৈরি করতে পারে , যা সমস্ত ধরণের মানচিত্রকে একক প্রকারের করে। উদাহরণস্বরূপ, ফান্টেক্টর ToInt : * -> *, যেখানে ToInt a = intসমস্ত প্রকারের জন্য এবং সমস্ত রূপের aমানচিত্র পূর্ণসংখ্যার পরিচয় ফাংশনে ম্যাপ করে: fmap f = \x -> x


আপনার উত্তরের জন্য ধন্যবাদ, এই প্রশ্নটি দুই বছরের বেশি পুরানো। "ফ্যাটাররা বিভাগগুলি তৈরি করে না।": আমি এটি বলিনি। আমি বলেছিলাম যে ফান্ট্যাকাররা দুটি বিভাগের মানচিত্র তৈরি করে, যেখানে লক্ষ্য বিভাগে অবশ্যই ফর্ম থাকতে হবে f a, যেখানে fআমি জানি, একজন টাইপ কনস্ট্রাক্টর। আমি বিভাগের তত্ত্ব থেকে যা মনে করি তা থেকে, এটি অবশ্যই একধরণের প্রথাগত উপস্থাপনা হতে হবে (বিভাগের একটি বিভাগের প্রাথমিক বিষয়? সম্ভবত আমি পরিভাষার অপব্যবহার করছি)) যাইহোক, আমি আপনার উত্তরটি মনোযোগ সহকারে পড়ব। অনেক ধন্যবাদ.
জর্জিও

@ জর্জিও হুফ, আমার কতক্ষণ বয়স হয়েছে তা খেয়াল করিনি। এটি কেবল "উত্তর না দেওয়া প্রশ্নাবলীতে" প্রদর্শিত হয়েছিল। আপনি "আধ্যাত্মিক উপস্থাপনা" বলতে কী বোঝায় তা নিশ্চিত নই। আমি যতদূর জানি (এবং আমি এখানে ভুল হতে পারি), ফান্টেক্টর এবং প্রাথমিক / টার্মিনাল অবজেক্টগুলির মধ্যে কোনও সম্পর্ক নেই।
বাগানের মাথায়

আমি এটি বোঝাতে চাইছি: en.wikedia.org/wiki/Initial_algebra (কম্পিউটার বিজ্ঞানের ব্যবহার দেখুন)। হাস্কেলে (বেশিরভাগ) ফান্টেক্টরগুলি একটি বীজগণিত ডেটা ধরণের উপর সংজ্ঞায়িত করা হয়। এই জাতীয় ফান্টারের টার্গেট অবজেক্টটি একটি প্রাথমিক বীজগণিত। প্রাথমিক বীজগণিতটি মান কন্সট্রাক্টর ব্যবহার করে নির্মিত পদগুলির সেটকে আইসোমরফিক ph যেমন তালিকার জন্য []এবং :। আমি এটি প্রচলিত উপস্থাপনার দ্বারা বোঝাতে চাইছি।
জর্জিও

হ্যাঁ, আমি জানি প্রাথমিক প্রাথমিক জিনিসটি কী এবং প্ররোচনামূলক ডেটাটাইপগুলি কোনও বিভাগের এফ-বীজগণিতের প্রাথমিক বস্তু। আপনি সঠিক যে অনেক টাইপ-কনস্ট্রাক্টর inductively সংজ্ঞায়িত করা হয়। কিন্তু এই হল না কঠোরভাবে প্রয়োজনীয়। উদাহরণস্বরূপ, functor (_, int)যে একটি টাইপ লাগে aপণ্যের প্রকার করার (a, int)এবং একটি ফাংশন f : 'a -> 'bথেকে g : 'a * int -> 'a * intপ্রস্তাবনামূলক নয়।
উদ্যান হেড

আপনি কি বোঝাতে চেয়েছেন: "লাগে ... একটি ফাংশন f : 'a -> 'bথেকে g : 'a * int -> 'b * int?
জর্জিও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.