সমস্যা
হাস্কেলের নিম্নলিখিত নকশা সমস্যা বিবেচনা করুন। আমার একটি সাধারণ, প্রতীকী ইডিএসএল রয়েছে যাতে আমি ভেরিয়েবল এবং সাধারণ এক্সপ্রেশন (মাল্টিভারিয়েট পলিনোমিয়ালস) যেমন প্রকাশ করতে চাই x^2 * y + 2*z + 1। তদ্ব্যতীত, আমি অভিব্যক্তিগুলির উপর কিছু প্রতীকী সমীকরণ প্রকাশ করতে চাই, বলতে চাই x^2 + 1 = 1, পাশাপাশি সংজ্ঞাও পছন্দ করি x := 2*y - 2।
লক্ষ্যটি হ'ল:
- ভেরিয়েবল এবং সাধারণ এক্সপ্রেশনগুলির জন্য পৃথক প্রকার রাখুন - নির্দিষ্ট ফাংশনগুলি ভেরিয়েবলগুলিতে প্রয়োগ করা যেতে পারে এবং জটিল এক্সপ্রেশন নয়। উদাহরণস্বরূপ, একজন সংজ্ঞা অপারেটর
:=ধরনের হতে পারে(:=) :: Variable -> Expression -> Definitionএবং এটি একটি জটিল অভিব্যক্তি (যদিও এটা তার বাম দিকে প্যারামিটার হিসাবে পাস করা সম্ভব নাও হতে হবে উচিত , তার ডান দিকে প্যারামিটার হিসাবে একটি পরিবর্তনশীল পাস করা সম্ভব হতে স্পষ্ট ঢালাই ছাড়া ) । - অভিব্যক্তিগুলির একটি উদাহরণ রয়েছে
Num, যাতে অভিব্যক্তিতে পূর্ণসংখ্যার লিটারালগুলি প্রচার করা সম্ভব হয় এবং কিছু অ্যাসিলিয়ারি র্যাপার অপারেটর প্রবর্তন না করে যোগ বা গুণনের মতো সাধারণ বীজগণিত ক্রিয়াকলাপগুলির জন্য একটি সুবিধাজনক স্বরলিপি ব্যবহার করা সম্ভব।
অন্য কথায়, আমি অভিব্যক্তিগুলিতে ভেরিয়েবলগুলির একটি অন্তর্নিহিত এবং স্ট্যাটিক টাইপ কাস্ট (জবরদস্তি) করতে চাই। এখন, আমি জানি যে, হাস্কেলগুলিতে কোনও অন্তর্নিহিত ধরণের কাস্ট নেই। তবুও, নির্দিষ্ট অবজেক্ট-ভিত্তিক প্রোগ্রামিং ধারণাগুলি (সহজ উত্তরাধিকার, এক্ষেত্রে ) ভাষা বর্ধনের সাথে বা ছাড়াই হাস্কেলের টাইপ সিস্টেমে প্রকাশযোগ্য । হালকা ওজনের সিনট্যাক্স রাখার সময় আমি কীভাবে উপরের দুটি বিষয়কে সন্তুষ্ট করতে পারি? এটা কি সম্ভব?
আলোচনা
এটি পরিষ্কার যে এখানে প্রধান সমস্যাটি হ'ল Numধরণের সীমাবদ্ধতা, যেমন
(+) :: Num a => a -> a -> a
নীতিগতভাবে, ভেরিয়েবল এবং এক্সপ্রেশন উভয়ের জন্য একটি একক (সাধারণীকরণ) বীজগণিত ডেটা টাইপ করা সম্ভব। তারপরে, কেউ :=এমনভাবে লিখতে পারেন যে, বাম-দিকের অভিব্যক্তিটি বৈষম্যযুক্ত এবং কেবলমাত্র একটি চলক নির্মাণকারী গ্রহণ করা হবে, অন্যথায় রান-টাইমের ত্রুটি সহ। এটি তবে কোনও পরিষ্কার, স্থির (যেমন সংকলন-সময়) সমাধান নয় ...
উদাহরণ
আদর্শভাবে, আমি যেমন একটি লাইটওয়েট সিনট্যাক্স অর্জন করতে চাই
computation = do
x <- variable
t <- variable
t |:=| x^2 - 1
solve (t |==| 0)
বিশেষত, আমি স্বরলিপিটি নিষিদ্ধ করতে চাই,
t + 1 |:=| x^2 - 1যেহেতু :=একটি চলক সংজ্ঞা দেওয়া উচিত এবং পুরো বাম দিকের এক্সপ্রেশন নয়।
FromVarটাইপক্লাস কীভাবে সহায়ক হবে তা আমি নিশ্চিত নই । আমি Exprউদাহরণ রেখে গিয়ে সুস্পষ্ট কাস্টস এড়াতে চাই Num। আমি প্রশ্নটি সম্পাদন করে একটি মুদ্রাক্ষর এর উদাহরণ যোগ করলাম যা আমি অর্জন করতে চাই।
class FromVar eকোনও পদ্ধতিতে কোনও ব্যবহার করতে পারেনfromVar :: Variable -> eএবং এর জন্য উদাহরণ সরবরাহ করতে পারেনExpressionএবংVariableতারপরে আপনার ভেরিয়েবলগুলিতে পলিমারফিক জাতীয় প্রকারগুলিx :: FromVar e => eথাকতে পারে I আমি এখনই আমার ফোনে থাকায় এটি কতটা ভাল কাজ করে তা পরীক্ষা করিনি have