একটি সামান্য পরিচিত তথ্য হ'ল আপনি যদি পর্যাপ্ত ভাষার এক্সটেনশানগুলি চালু করেন (জিএইচসি) হাস্কেল একটি গতিময় টাইপযুক্ত ব্যাখ্যা করা ভাষা হয়ে যায়! উদাহরণস্বরূপ নিম্নলিখিত প্রোগ্রামটি প্রয়োগ করে।
{-# Language MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, UndecidableInstances #-}
data Zero
data Succ a
class Add a b c | a b -> c
instance Add Zero a a
instance (Add a b c) => Add (Succ a) b (Succ c)
এটি আর হাস্কেলের মতো দেখায় না। একের পরিবর্তে অবজেক্টগুলির উপর অপারেটিংয়ের পরিবর্তে আমরা প্রকারভেদে অপারেট করি। প্রতিটি নম্বর এটি নিজস্ব টাইপ। ফাংশন পরিবর্তে আমাদের টাইপ ক্লাস আছে। ক্রিয়ামূলক নির্ভরতা আমাদের প্রকারের মধ্যে ফাংশন হিসাবে তাদের ব্যবহার করতে দেয়।
তাহলে আমরা কীভাবে আমাদের কোডটি চালাব? আমরা অন্য ক্লাস ব্যবহার করি
class Test a | -> a
where test :: a
instance (Add (Succ (Succ (Succ (Succ Zero)))) (Succ (Succ (Succ Zero))) a)
=> Test a
এই সেট ধরণ test
ধরণ 4 + + 3. আমরা যদি এই ghci আমরা যে পাবেন মধ্যে খুলুন test
টাইপ 7 প্রকৃতপক্ষে হল:
Ok, one module loaded.
*Main> :t test
test :: Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero))))))
কার্য
আমি চাই আপনি এমন একটি শ্রেণি প্রয়োগ করুন যা দুটি পেনো সংখ্যাকে (অ-নেতিবাচক পূর্ণসংখ্যার) গুণ করে। পিয়ানো সংখ্যাগুলি উপরের উদাহরণে একই ডেটা ধরণের ব্যবহার করে নির্মিত হবে:
data Zero
data Succ a
এবং আপনার ক্লাসটি উপরের মতো একইভাবে মূল্যায়ন করা হবে। আপনার ক্লাসের নাম আপনি যা খুশি রাখতে পারেন।
আপনি যে কোনও জিএসিসি ল্যাঙ্গুয়েজ এক্সটেনশনগুলি ব্যবহার করতে পারেন কোনও বাইট ছাড়াই আপনার চান।
পরীক্ষার কেস
এই পরীক্ষার কেসগুলি অনুমান করে যে আপনার ক্লাসের নাম দেওয়া হয়েছে M
, আপনি চাইলে অন্য কোনও নাম রাখতে পারেন।
class Test1 a| ->a where test1::a
instance (M (Succ (Succ (Succ (Succ Zero)))) (Succ (Succ (Succ Zero))) a)=>Test1 a
class Test2 a| ->a where test2::a
instance (M Zero (Succ (Succ Zero)) a)=>Test2 a
class Test3 a| ->a where test3::a
instance (M (Succ (Succ (Succ (Succ Zero)))) (Succ Zero) a)=>Test3 a
class Test4 a| ->a where test4::a
instance (M (Succ (Succ (Succ (Succ (Succ (Succ Zero)))))) (Succ (Succ (Succ Zero))) a)=>Test4 a
ফলাফল
*Main> :t test1
test1
:: Succ
(Succ
(Succ
(Succ
(Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero)))))))))))
*Main> :t test2
test2 :: Zero
*Main> :t test3
test3 :: Succ (Succ (Succ (Succ Zero)))
*Main> :t test4
test4
:: Succ
(Succ
(Succ
(Succ
(Succ
(Succ
(Succ
(Succ
(Succ
(Succ
(Succ
(Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero)))))))))))))))))
প্রযুক্তিগত সাক্ষাত্কার টাইপিং থেকে অনুপ্রেরণা আঁকুন