কেন হাস্কেলের এনামের একটি সাবক্লাস বেঁধে দেওয়া হচ্ছে না


9

দেখে মনে হচ্ছে যে কোনও বাউন্ডেড উদাহরণটির এনামের বুদ্ধিমান বাস্তবায়ন হওয়া উচিত। আমি ব্যক্তিগতভাবে কাউন্টারেরেক্সাম্পলটি ভাবতে পারি না, যদিও কেউ যদি এমন কোনও রোগ নিয়ে আসে যা রোগগত নয় তবে আমি কেন বুঝতে পারি তা কেন তা নয়।

:iদুটি টাইপ ক্লাসে কাজ করা থেকে মনে হয় বর্তমানে স্ট্যান্ডার্ড লাইব্রেরিতে একমাত্র ব্যতিক্রম টিউপলসের জন্য রয়েছে, যা সীমান্তযুক্ত তবে এনুমস নয়। যাইহোক, যে কোনও বাউন্ডেড টিউপলকে অবশ্যই চূড়ান্তভাবে গণনা করা উচিত, কেবলমাত্র সর্বশেষ উপাদানটিকে বাড়িয়ে তোলা এবং তারপরে যখন এটি ম্যাক্সবাউন্ডে যায় তখন চারপাশে মোড়ানো।

এই পরিবর্তনটি সম্ভবত এনাম মানগুলি অতিক্রম করার জন্য নিরাপদ / লুপিং পথের জন্য বাউন্ডেড যুক্ত predBএবং এর nextBমতো কিছু অন্তর্ভুক্ত করতে পারে । এই ক্ষেত্রে toEnum 0 :: (...)সমান হবে(toEnum 0, toEnum 0, ...) :: (...)


3
সত্যিকার অর্থে এর উত্তর দিতে পারবেন না তবে 0 এবং 1 এর মধ্যে সমস্ত আসল সংখ্যার ব্যাপ্তি বিবেচনা করুন এটির নীচের এবং উপরের সীমানা স্পষ্ট রয়েছে তবে এতে অগণিত সদস্য রয়েছে।
ডোভাল

@ সরানো যে একটি সুস্পষ্ট পয়েন্ট। তবে সাধারণভাবে সমস্ত আসল সংখ্যা সম্পর্কে ( একইভাবে অসীম সদস্য) একই কথা বলা যেতে পারে, তবে Double/ Floatএবং সমস্ত অনুরূপ প্রকারভেদ Enumযেভাবেই বাস্তবায়িত হয়, তারা কেবল তৈরি করে succ = (+ 1)এবং fromEnum = truncate। হাস্কেলের উপায়টি বাস্তবে বাস্তবতার দৃষ্টিকোণ থেকে বোঝা যায় অন্যথায় [0, 0.5 ..] এবং এর মতোই কাজ করবে না, তাই মনে হচ্ছে হাস্যেল এনাম্সের ক্ষেত্রে গণ্যতার বিষয়ে চিন্তা করেন না।
সেমিকোলন

1
আমি সচেতন যে ছিল না succহয় (+1)। এটি অদ্ভুত, কারণ Doubleএবং Floatঅসীম নির্ভুলতা নেই এবং সুতরাং এটি গণনীয় - succএটি +1 ইউএলপি হিসাবে সংজ্ঞায়িত করা যেতে পারে ।
ডোভাল

2
@ ডোভাল আমি মনে করি এর কারণ হ্যাশকেল কোর দল চাইছিল [১ ..] একই জিনিসটিকে ডাবলসের সাথে বোঝাতে চেয়েছিল যার অর্থ ইন্টের সাথে।
সেমিকোলন

@ সেমিকোলন ডাবলস এবং ফ্লোটগুলি আসল সংখ্যা নয় (যেমন কিছু নির্ভুলতা না হারিয়ে পিআইকে একটি ডাবলীতে সঞ্চয় করতে পারে না) তাই তারা গণনাযোগ্য
জে কে।

উত্তর:


8

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

আংশিক অর্ডারের ক্রমটি হল সাবটিপিং সম্পর্ক <:। উপরের আবদ্ধটি শীর্ষস্থানীয় (যা সি # কল objectএবং স্কালা কলগুলি Any) হবে এবং নীচের গণ্ডিটি নীচের প্রকারে হবে (স্কালার Nothing; সি # / জাভার কথা বলার সমতুল্য নেই)।

তবে টাইপ সিস্টেমে সমস্ত প্রকারের গণনা করার কোনও উপায় নেই, সুতরাং আপনি এটি লিখতে পারবেন না instance Enum Type। এটি পরিষ্কার হওয়া উচিত: ব্যবহারকারীরা তাদের নিজস্ব প্রকারগুলি লিখতে পারেন যাতে তারা আগে থেকে কী হবে তা জানার উপায় নেই। আপনি যে কোনও প্রোগ্রামে সমস্ত ধরণের গণনা করতে পারেন, তবে পুরো সিস্টেমে নয়।

তেমনি, (সাব টাইপিংয়ের একটি নির্দিষ্ট যুক্তিসঙ্গত সংজ্ঞা অনুসারে) প্রতিচ্ছবি <:, ট্রানজিটিভ এবং এন্টিসিমমেট্রিক তবে মোট নয় । এর মধ্যে কয়েক প্রকারের সম্পর্ক রয়েছে যা সম্পর্কিত নয় <:। ( Catএবং Dogউভয়ই উপপ্রকার Animal, তবে উভয়ই অন্যটির উপপ্রকার নয়))


মনে করুন যে আমরা একটি সাধারণ ওও ভাষার জন্য একটি সংকলক লিখছি। আমাদের সিস্টেমে প্রকারের উপস্থাপনা এখানে:

data Type = Bottom | Class { name :: String, parent :: Type } | Top

এবং সাব টাইপিং সম্পর্কের সংজ্ঞা:

(<:) :: Type -> Type -> Bool
Bottom <: _ = True
Class _ _ <: Bottom = False
Class n t <: s@(Class m _)
    | n == m = True  -- you can't have different classes with the same name in this hypothetical language
    | otherwise = t <: s  -- try to find s in the parents of this class
Class _ _ <: Top = True
Top <: Top = True
Top <: _ = False

এটি আমাদেরকে একটি অত্যাধিক সম্পর্ক দেয়।

(>:) :: Type -> Type -> Bool
t >: s = s <: t

আপনি দু'ধরনের নূন্যতম উপরের সীমাটিও খুঁজে পেতে পারেন,

lub :: Type -> Type -> Type
lub Bottom s = s
lub t Bottom = t
lub t@(Class _ p) s@(Class _ q) =
    | t >: s = t
    | t <: s = s
    | p >: s = p
    | t <: q = q
    | otherwise = lub p q
lub Top _ = Top
lub _ Top = Top

অনুশীলন: দেখান যে নীচে এবং নীচে Typeএকটি সীমাবদ্ধ সম্পূর্ণ পোসেট দুটি উপায়ে <:গঠন করে >:


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

একটি আদেশ একটি সাম্য বোঝায় - কেবল সংজ্ঞায়িত করুন x == y = x <= y && y <= x। আমি যদি একটি Posetক্লাস ডিজাইন করতাম তবে আমি চাইতাম class Eq a => Poset a। একটি দ্রুত গুগল নিশ্চিত করে যে অন্যান্য লোকদেরও একই ধারণা ছিল
বেনিয়ামিন হজসন

দুঃখিত আমার প্রশ্নটি দ্ব্যর্থক ছিল। আমি যা বোঝাতে চেয়েছি তা হ'ল বাউন্ডেড ইকিকে অন্তর্ভুক্ত করে এমনকি এটি অর্ডকে বোঝায় না।
সেমিকোলন

@ সেমিকোলন আবার দুই শ্রেণীর মধ্যে কোনও সম্পর্ক নেই। data Bound a = Min | Val a | Maxকোন উপাদান এবং উপাদানগুলির aসাথে কোন প্রকারের বৃদ্ধি করে তা বিবেচনা করুন । নির্মাণ করার মাধ্যমে সবসময় একটি দৃষ্টান্ত তৈরি করা যেতে পারে কিন্তু এটি শুধুমাত্র equatable হতে চাই যদি অন্তর্নিহিত টাইপ হয়+∞-∞Bound aBoundeda
বেঞ্জামিন হজসন

ঠিক আছে যথেষ্ট ন্যায্য। আমি একটা উদাহরণ ফাংশন যে নিতে এবং ধরন ফেরত মান হতে পারে Double, যেখানে const (1/0)হয় maxBoundএবং const (negate 1/0)হয় minBoundকিন্তু \x -> 1 - x\x -> x - 1অনুপম হয়।
সেমিকোলন

4

এটি অপারেশনগুলি স্বাধীন হওয়ার কারণে, তাই তাদেরকে একটি সাবক্লাস সম্পর্কের সাথে বেঁধে রাখা আসলে আপনার কিছুই কিনে না। বলুন যে আপনি একটি কাস্টম প্রকার তৈরি করতে চেয়েছিলেন যা কার্যকর হয়েছে Bounded, সম্ভবত Doublesসর্বাধিক এবং ন্যূনতমের মধ্যে সীমাবদ্ধ রয়েছে, তবে আপনার কোনও Enumঅপারেশনের প্রয়োজন নেই । যদি Boundedএকটি সাবক্লাস হয়, আপনাকে যে Enumকোনওভাবেই সমস্ত ফাংশন প্রয়োগ করতে হবে , কেবল এটি সঙ্কলন করতে পেতে।

এটি যুক্তিসঙ্গত বাস্তবায়ন Enum, বা টাইপক্লাসের অন্য কোনও সংখ্যার জন্য আসলেই কিছু যায় আসে না। যদি আপনার আসলে এটির প্রয়োজন না হয় তবে আপনাকে এটি প্রয়োগ করতে বাধ্য করা উচিত নয়।

এর সাথে পার্থক্য করুন Ordএবং বলুন Eq। সেখানে, Ordঅপারেশনগুলি নির্ভর করে Eq, সুতরাং সদৃশতা এড়াতে এবং ধারাবাহিকতা নিশ্চিত করার জন্য সাবক্লাসের প্রয়োজনীয়তা বোধ করা যায়।


1
এই ক্ষেত্রে, এটি সংজ্ঞার অংশ। সমস্ত মনাদ সংজ্ঞা অনুসারে আবেদনকারী এবং মজাদারও, সুতরাং আপনি অন্যকে পূরণ না করেই মোনাড "চুক্তি" সম্পাদন করতে পারবেন না। আমি গণিতের সাথে এতটা পরিচিত নই যে তা যদি কোনও মৌলিক সম্পর্ক বা আরোপিত সংজ্ঞা হয় তবে তবে যেভাবেই হোক, আমরা এখন এটির সাথে আটকে আছি।
কার্ল বিলেফেল্ট

6
@ সেমিকোলন এর ডকুমেন্টেশনগুলিতেBounded বলা হয়েছে "অর্ড বাউন্ডেডের সুপারক্লাস নয় কারণ পুরোপুরি অর্ডার না দেওয়া প্রকারের উপরের এবং নিম্ন সীমানাও থাকতে পারে।"
বেনিয়ামিন হডসন

1
@ বেঞ্জামিনহডসন আংশিক অর্ডার করা প্রকারগুলি সম্পর্কে ভাবেননি। অ-প্যাথলজিকাল উদাহরণ এবং ডকুমেন্টেশন উদ্ধৃত করার জন্য +1।
ডোভাল

1
@ সেমিকোলন কম্পিউটারের জগৎ থেকে আংশিক অর্ডারের একটি উদাহরণ ওও ভাষায় সাব-টাইপিং হতে পারে। লেখার <:জন্য একটি উপপ্রকার , ∀ T S. T <: S ∨ S <: Tহোল্ড করে না (যেমন, int !<: bool ∧ bool !<: int)। আপনি যদি একটি সংকলক লিখছিলেন তবে আপনি সম্ভবত এটির মধ্যে চলে যেতে চাই।
বেনিয়ামিন হজসন

1
পুনঃটুইট সুতরাং উদাহরণস্বরূপ যদি A হ'ল B এবং C এর একটি সুপারক্লাস, এবং D B এবং C এর একটি সাবক্লাস হয়, তবে B এবং C তুলনীয় নয় তবে A এবং D সর্বাধিক / মিনিট?
সেমিকোলন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.