একই ধরণের ডেটা কনস্ট্রাক্টরগুলিকে কেন বিভিন্ন ধরণের কনস্ট্রাক্টরে অনুমোদিত নয়?


11

নিম্নলিখিত ঘোষণাটি একটি ত্রুটি দেয়:

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)।

আমি নিশ্চিত যে ভাষা ডিজাইনাররা বিভিন্ন ধরণের ডেটা কনস্ট্রাক্টরদের জন্য একই নামটি ব্যবহার করতে অস্বীকার করার উপযুক্ত কারণ রয়েছে তবে আমি শিখতে চাই: কেন, যখন এটি স্পষ্টতই প্রয়োজনীয় নয়?

(এবং টাইপ বিচ্ছিন্নতা হ্যাস্কেলের রুটি-মাখনের ব্যবসা!)


3
আপনি যে মাঝে মাঝে ধরণ সচেতন নিশ্চিত: সংক্রান্ত টাইপ আর্গুমেন্টের দ্বারা অনুমিত হচ্ছে যুক্তি ধরণ থেকে অনুমিত হয় ফাংশন ?

@ ডেলান আমি সে সম্পর্কে অবগত ছিলাম না ... আমার কাছে উত্তর বলে মনে হচ্ছে। আমি বরাবরই অনুমানটি নীচে রেখেছিলাম, যদিও আমি টাইপ গ্রাফের অপর প্রান্ত থেকে টাইপ তথ্য ব্যবহার করে অস্পষ্টতার সমাধান দেখতে পেলাম যেমন আপনি একটি নির্ধারক ফ্যাক্টর হিসাবে বর্ণনা করেন ... এর জন্য আমার মানসিক চিত্রটি নীচের অংশে ফিরে আসা প্রকারগুলি শীর্ষে গ্রাফ এবং ফাংশন কলগুলি, রেজোলিউশনটি নীচ থেকে ভাঁজ করে গঠিত একটি সামগ্রিক, তবে এটি পুরো চিত্র নয়, আপনি কী বলছেন? অবাক হওয়ার মতো বিষয় নয়, নিখুঁত অনুমানের সাথে নির্ভর করে টাইপ করা ভাষায় এটি সম্ভবত আরও সঠিক ..
জিমি হোফা

উত্তর:


13

এটি কারণ ডেটা কনস্ট্রাক্টরগুলি কেবল ফাংশন এবং হাস্কেলের মধ্যে ফাংশন ওভারলোডিং অনুমোদিত নয়। আপনি নিজের প্রকারগুলি সংজ্ঞায়িত করতে GADT বাক্য গঠন ব্যবহার করলে এটি আরও স্পষ্ট হতে পারে:

{-# LANGUAGE GADTs #-}
data Obj2d where
    Rect :: Float -> Float -> Obj2d   -- a function from floats to obj2d's
    Translate :: Vec2d -> Obj2d       -- a function from vec2d's to Obj2d's

আমি বিশ্বাস করি যে তারা (জিএইচসি দেবগণ) type classএকই ধরণের ডেটা কনস্ট্রাক্টর, বা অনুরূপ কিছু ভাগ করে নেওয়ার জন্য সমস্ত ধরণের জন্য একটি নতুন প্রবর্তন জড়িত এই সমস্যার সম্ভাব্য সমাধানগুলিতে কাজ করছেন । তাই থাকুন, আপনার সমস্যার সমাধান খুব শীঘ্রই আসতে পারে! (আমি আশা করি)


আমি অবশ্যই এই নির্মানগুলির জন্য type classআপনাকে অপেক্ষা করছি I'm - কারণটি হ'ল: আমার কোনও সমস্যা নেই, আমিও করতে পারি Translate2এবং Translate3d, তবে আমি নাম স্পেসটিকে দূষিত করব না।
এ জেড

আমি কোনও জিএইচসি দেব নই, তাই এটি কেবল শুনুন-বলুন। আমি আশা করি এটিও ঘটবে।
bstamour
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.