নিম্নলিখিত ঘোষণাটি একটি ত্রুটি দেয়:
type Vec2d = (Float, Float)
type Vec3d = (Float, Float, Float)
-- Rect x y defines a rectangle spanning from (0,0) to (x,y)
data Obj2d = Rect Float Float
| Translate Vec2d Obj2d
-- Cuboid x y z defines a cuboid spanning from (0,0,0) to (x,y,z)
data Obj3d = Cuboid Float Float Float
| Translate Vec3d Obj3d
যথা Multiple declarations of 'Translate'
।
এখন, আমি ভাবছি কেন এই সীমাবদ্ধতা চালু করা হয়েছিল?
সীমাবদ্ধতা না থাকলে একজন লিখতে পারতেন
Translate (1, 1) Rect 2 2
এবং
Translate (1, 2, 3) Cuboid 1 1 1
, যা স্বাভাবিক বলে মনে হচ্ছে।
আমি (তাত্ক্ষণিকভাবে) দেখছি না কীভাবে এটি একই নামটি ব্যবহার করতে অস্বীকার করার জন্য বিডিংয়ের বিডিংয়ের ফলে পরিণতি ঘটতে পারে, এই প্রকারটি আর্গুমেন্টের দ্বারা অনুমান করা যেতে পারে ( Rect 2 2
এটি একটি Obj2d
, Cuboid 1 1 1
একটি Obj3d
)।
আমি নিশ্চিত যে ভাষা ডিজাইনাররা বিভিন্ন ধরণের ডেটা কনস্ট্রাক্টরদের জন্য একই নামটি ব্যবহার করতে অস্বীকার করার উপযুক্ত কারণ রয়েছে তবে আমি শিখতে চাই: কেন, যখন এটি স্পষ্টতই প্রয়োজনীয় নয়?
(এবং টাইপ বিচ্ছিন্নতা হ্যাস্কেলের রুটি-মাখনের ব্যবসা!)