আমি একটি ছোট ল্যাম্বডা ক্যালকুলাস সংকলকটিতে কাজ করছি যার একটি ওয়ার্কিং হিন্ডলি-মিলনার ধরণের ইনফারেন্স সিস্টেম রয়েছে এবং এটি এখন পুনরাবৃত্তির ক্ষেত্রেও সমর্থন করে (লিঙ্কযুক্ত কোডে নয়), যা আমি বুঝতে পেরেছি এটি টুরিং সম্পূর্ণ করার জন্য যথেষ্ট হওয়া উচিত ।
এখন সমস্যাটি হ'ল এটিকে কীভাবে তালিকাগুলি সমর্থন করতে হবে বা এটি ইতিমধ্যে তাদের সমর্থন করে কিনা এবং আমার কেবল তাদের এনকোড করার জন্য কোনও উপায় খুঁজে বের করতে হবে কিনা আমার কোনও ধারণা নেই। আমি টাইপ সিস্টেমে নতুন নিয়ম যুক্ত না করে এগুলি সংজ্ঞায়িত করতে সক্ষম হতে চাই।
সবচেয়ে সহজ উপায় আমি একটি তালিকা মনে করতে পারেন x
কিছু হয় যে হিসাবে null
(অথবা খালি তালিকা), অথবা একটি যুগল উভয় একটি রয়েছে x
এবং একটি তালিকা x
। তবে এটি করার জন্য আমার জোড়া এবং বা এর সংজ্ঞা দিতে সক্ষম হতে হবে যা আমি বিশ্বাস করি পণ্য এবং যোগফলের ধরণগুলি।
দেখে মনে হচ্ছে যে আমি জোড়গুলি এইভাবে সংজ্ঞায়িত করতে পারি:
pair = λabf.fab
first = λp.p(λab.a)
second = λp.p(λab.b)
যেহেতু pair
টাইপটি হবে a -> (b -> ((a -> (b -> x)) -> x))
, পাস করার পরে বলুন, একটি int
এবং এ string
, এটি টাইপের সাথে এমন কিছু উপার্জন করতে (int -> (string -> x)) -> x
পারে যা একটি জোড় int
এবং এর উপস্থাপনা হবে string
। এখানে আমাকে বিরক্ত করার বিষয়টি হ'ল এটি যদি কোনও জুটির প্রতিনিধিত্ব করে তবে কেন এটি যুক্তিযুক্তভাবে সমান নয়, বা প্রস্তাবটির বোঝাও নয় int and string
? তবে, এর সমতুল্য (((int and string) -> x) -> x)
, যদি আমি কেবল ফাংশনের পরামিতি হিসাবে পণ্য ধরণের থাকতে পারি। এই উত্তরএই সমস্যাটির সমাধান করেছেন বলে মনে হয় তবে তিনি যে চিহ্নগুলি ব্যবহার করেন তার অর্থ কী তা আমার কোনও ধারণা নেই। এছাড়াও, যদি এটি সত্যিই কোনও পণ্যের ধরণকে এনকোড করে না, তবে উপরের জোড়াগুলির আমার সংজ্ঞাটি (আমি এন-টিপলসকে একইভাবে সংজ্ঞা দিতে পারি) বিবেচনা করে পণ্য প্রকারের সাথে আমি কী করতে পারি? যদি তা না হয়, তবে কি এই সত্যটির বিরোধিতা করবে না যে আপনি কেবল ছদ্মবেশ ব্যবহার করে (এএফআইকে) সংমিশ্রণটি প্রকাশ করতে পারবেন না?
এছাড়াও, যোগফলের প্রকারটি কেমন? আমি কি কেবলমাত্র ফাংশন প্রকারটি ব্যবহার করে এটিকে এনকোড করতে পারি? যদি তাই হয় তবে এটি তালিকা সংজ্ঞায়িত করার পক্ষে যথেষ্ট হবে? অথবা অন্যথায়, আমার টাইপ সিস্টেমটি প্রসারিত না করে তালিকাগুলি সংজ্ঞায়নের কোনও অন্য উপায় আছে? এবং যদি না হয়, আমি এটি যথাসম্ভব সহজ রাখতে চাইলে আমার কী পরিবর্তন করা দরকার?
দয়া করে মনে রাখবেন যে আমি একজন কম্পিউটার প্রোগ্রামার কিন্তু কম্পিউটার বিজ্ঞানী বা গণিতবিদ নই এবং গণিতের স্বরলিপি পড়তে খুব খারাপ।
সম্পাদনা: আমি নিশ্চিত নই যে আমি এখনও অবধি যা প্রয়োগ করেছি তার প্রযুক্তিগত নাম কী, তবে আমার কাছে যা আছে তা মূলত আমি উপরে লিঙ্ক করেছি, এটি একটি সীমাবদ্ধ প্রজন্মের অ্যালগরিদম যা প্রয়োগগুলি, বিমূর্তি এবং ভেরিয়েবলগুলির নিয়ম ব্যবহার করে হিনলে-মিলনার অ্যালগরিদম থেকে এবং তারপরে একটি একীকরণ অ্যালগরিদম যা মূল প্রকারটি পায়। উদাহরণস্বরূপ, অভিব্যক্তিটি \a.a
প্রকারটি দেবে a -> a
, এবং অভিব্যক্তিটি \a.(a a)
ঘটে যাওয়া চেক ত্রুটিটি ছুঁড়ে দেবে। সর্বোপরি, ঠিক কোনও let
নিয়ম নেই তবে এমন একটি ফাংশন যা একই প্রভাব বলে মনে হচ্ছে যা আপনাকে এই সিডো কোডের মতো পুনরাবৃত্ত বিশ্বব্যাপী ফাংশনগুলি সংজ্ঞায়িত করতে দেয়:
GetTypeOfGlobalFunction(term, globalScope, nameOfFunction)
{
// Here 'globalScope' contains a list of name-value pair where every value is of class 'ClosedType',
// meaning their type will be cloned before unified in the unification algorithm so that they can be used polymorphically
tempType = new TypeVariable() // Assign a dummy type to `tempType`, say, type 'x'.
// The next line creates an scope with everything in 'globalScope' plus the 'nameOfFunction = tempType' name-value pair
tempScope = new Scope(globalScope, nameOfFunction, tempType)
type = TypeOfTerm(term, tempScope) // Calculate the type of the term
Unify(tempType, type)
return type
// After returning, the code outside will create a 'ClosedType' using the returned type and add it to the global scope.
}
কোডটি মূলত এই শব্দটির ধরনটি যথারীতি পায় তবে একত্রিত হওয়ার আগে এটি ফাংশনের নামটি একটি ডামি টাইপের সাথে টাইপ স্কোপের সাথে সংজ্ঞায়িত করা হয় যাতে এটি নিজের মধ্যে থেকেই পুনরাবৃত্তভাবে ব্যবহার করা যায়।
সম্পাদনা 2: আমি কেবল বুঝতে পেরেছি যে আমার চাইলে একটি তালিকা সংজ্ঞায়িত করার জন্য আমারও পুনরাবৃত্ত প্রকারের প্রয়োজন হবে যা আমার নেই।
let func = \x -> (func x)
) আপনি আমার কাছে যা পান তা পেতে পারেন।