হাস্কেলের টাইপ সিস্টেমটি কি আনুষ্ঠানিকভাবে জাভার সমতুল্য? [বন্ধ]


66

আমি বুঝতে পারি যে কিছু জিনিস অন্য ভাষার তুলনায় এক ভাষাতে সহজ / শক্ত, তবে আমি কেবল টাইপ-সম্পর্কিত বৈশিষ্ট্যগুলিতে আগ্রহী যা অন্যটিতে অসম্ভব / অপ্রাসঙ্গিক possible এটিকে আরও সুনির্দিষ্ট করার জন্য, আসুন হ্যাস্কেল প্রকারের এক্সটেনশনগুলি উপেক্ষা করুন কারণ সেখানে প্রচুর পরিমাণে ক্রেজি / শীতল স্টাফ রয়েছে।


4
আমিও এই প্রশ্নের দীর্ঘ বায়ুযুক্ত বিভাগের তাত্ত্বিকদের উত্তর শুনতে আগ্রহী; যদিও আমি সন্দেহ করি যে আমি এটি বিশেষত বুঝতে পারি, তবুও আমি এটির বিশদ বিবরণে আগ্রহী। আমি যে জিনিসগুলি পড়েছি সেগুলির প্রতি আমার প্রবণতা হ'ল এইচএম টাইপ সিস্টেমটি আপনার কোডটি কী করে তা সম্পর্কে একটি টোন জানতে সংকলককে মঞ্জুরি দেয়। কারণ এটি আচরণের বিষয়ে এতগুলি গ্যারান্টি দেওয়ার পাশাপাশি প্রকারভেদগুলি অনুমান করতে সক্ষম। তবে এটি কেবল আমার অন্ত্র প্রবৃত্তি এবং আমি নিশ্চিত যে এর মধ্যে এমন আরও কিছু জিনিস রয়েছে যা সম্পর্কে আমি সম্পূর্ণ অজানা।
জিমি হোফা

1
এটি দুর্দান্ত প্রশ্ন - দুর্দান্ত হাস্কেল / জেভিএম বিতর্কের জন্য অনুসরণকারীদের কাছে এটি টুইট করার সময়!
মার্টিজ ভার্বার্গ

6
@ এম3 থাইডম্যান: জাভা যেমন উচ্চতর অর্ডার ফাংশনগুলির জন্য স্কালার ঠিক তেমন সমর্থন করে। স্কালায়, প্রথম শ্রেণির ফাংশনগুলি কেবল জাভা এর মতোই একক বিমূর্ত পদ্ধতি সহ বিমূর্ত শ্রেণির উদাহরণ হিসাবে উপস্থাপিত হয়। অবশ্যই, স্কালায় এই ফাংশনগুলি সংজ্ঞায়িত করার জন্য সিনট্যাকটিক চিনি রয়েছে এবং এতে প্রাক-সংজ্ঞায়িত ফাংশন এবং পদ্ধতিগুলি উভয়ই সমৃদ্ধ স্ট্যান্ডার্ড লাইব্রেরি রয়েছে যা কার্যগুলি গ্রহণ করে, তবে একটি টাইপ সিস্টেমের দৃষ্টিকোণ থেকে , যা এই প্রশ্নটি সম্পর্কে, কোনও পার্থক্য নেই । সুতরাং, যদি স্কালা এটি করতে পারে তবে জাভাও এটি করতে পারে এবং আসলে জাভার জন্য হাস্কেল-অনুপ্রাণিত এফপি লাইব্রেরি রয়েছে।
Jörg ডব্লু মিটাগ

2
@ এম3 থিডিডম্যান: এই প্রশ্নটি এটাই নয়।
ফিল

7
@ m3th0dman তারা নিখুঁতভাবে সাধারণ ধরণের। কিছু সিনট্যাক্টিক সুন্দরতা বাদে তালিকাগুলিতে বিশেষ কিছুই নেই। আক্ষরিক সিনট্যাক্স এবং কনস্ট্রাক্টরের নাম বাদে আপনি নিজের বীজগণিত ডেটা টাইপটি বিল্ট-ইন তালিকার সমতুল্য সহজেই সংজ্ঞায়িত করতে পারেন।
sepp2k

উত্তর:


63

("জাভা", যেমন এখানে ব্যবহার করা হয়েছে, এটি স্ট্যান্ডার্ড জাভা এসই 7 হিসাবে সংজ্ঞায়িত করা হয়েছে ; "হাস্কেল", এখানে ব্যবহৃত হিসাবে স্ট্যান্ডার্ড হাস্কেল 2010 হিসাবে সংজ্ঞায়িত করা হয়েছে ।)

জাভা টাইপ সিস্টেমে যে জিনিস রয়েছে তবে হাস্কেলের তা নেই:

  • নামমাত্র সাব টাইপ পলিমারফিজম
  • আংশিক রানটাইম টাইপ তথ্য

হাস্কেলের টাইপ সিস্টেমে যে জিনিস রয়েছে তা জাভাতে নেই:

  • সীমিত অ্যাডহক পলিমারফিজম
    • "সীমাবদ্ধতা ভিত্তিক" সাব টাইপ পলিমারফিজমের উত্থান দেয়
  • উচ্চতর ধরণের প্যারামেট্রিক পলিমারফিজম
  • প্রধান টাইপিং

সম্পাদনা করুন:

উপরে তালিকাভুক্ত প্রতিটি পয়েন্টের উদাহরণ:

জাভা থেকে অনন্য (হাস্কেলের তুলনায়)

নামমাত্র সাব টাইপ পলিমারফিজম

/* declare explicit subtypes (limited multiple inheritance is allowed) */
abstract class MyList extends AbstractList<String> implements RandomAccess {

    /* specify a type's additional initialization requirements */
    public MyList(elem1: String) {
        super() /* explicit call to a supertype's implementation */
        this.add(elem1) /* might be overridden in a subtype of this type */
    }

}

/* use a type as one of its supertypes (implicit upcasting) */
List<String> l = new ArrayList<>() /* some inference is available for generics */

আংশিক রানটাইম ধরণের তথ্য

/* find the outermost actual type of a value at runtime */
Class<?> c = l.getClass // will be 'java.util.ArrayList'

/* query the relationship between runtime and compile-time types */
Boolean b = l instanceOf MyList // will be 'false'

হাস্কেলের কাছে অনন্য (জাভার তুলনায়)

বাঁধা অ্যাড-হক পলিমারফিজম

-- declare a parametrized bound
class A t where
  -- provide a function via this bound
  tInt :: t Int
  -- require other bounds within the functions provided by this bound
  mtInt :: Monad m => m (t Int)
  mtInt = return tInt -- define bound-provided functions via other bound-provided functions

-- fullfill a bound
instance A Maybe where
  tInt = Just 5
  mtInt = return Nothing -- override defaults

-- require exactly the bounds you need (ideally)
tString :: (Functor t, A t) => t String
tString = fmap show tInt -- use bounds that are implied by a concrete type (e.g., "Show Int")

"সীমাবদ্ধ ভিত্তিক" সাব টাইপ পলিমারফিজম (সীমাবদ্ধ অ্যাড-হক পলিমॉर्फিজমের উপর ভিত্তি করে)

-- declare that a bound implies other bounds (introduce a subbound)
class (A t, Applicative t) => B t where -- bounds don't have to provide functions

-- use multiple bounds (intersection types in the context, union types in the full type)
mtString :: (Monad m, B t) => m (t String)
mtString = return mtInt -- use a bound that is implied by another bound (implicit upcasting)

optString :: Maybe String
optString = join mtString -- full types are contravariant in their contexts

উচ্চতর ধরণের প্যারামেট্রিক পলিমারফিজম

-- parametrize types over type variables that are themselves parametrized
data OneOrTwoTs t x = OneVariableT (t x) | TwoFixedTs (t Int) (t String)

-- bounds can be higher-kinded, too
class MonadStrip s where
  -- use arbitrarily nested higher-kinded type variables
  strip :: (Monad m, MonadTrans t) => s t m a -> t m a -> m a

অধ্যক্ষ টাইপিং

এটির প্রত্যক্ষ উদাহরণ দেওয়া শক্ত, তবে এর অর্থ হল যে প্রতিটি অভিব্যক্তিতে হুবহু একটি সাধারণ ধরণের থাকে (যাকে তার মূল প্রকার বলা হয় ), যা এই অভিব্যক্তির ক্যানোনিকাল টাইপ হিসাবে বিবেচিত হয়। "সীমাবদ্ধতা ভিত্তিক" সাব টাইপ পলিমॉर्फিজম (উপরে দেখুন) এর ক্ষেত্রে, একটি অভিব্যক্তির মূল প্রকারটি হ'ল প্রতিটি সম্ভাব্য প্রকারের অনন্য উপপ্রকার যা সেই অভিব্যক্তি হিসাবে ব্যবহৃত হতে পারে। (অব্যক্ত) হাস্কেলতে প্রিন্সিপাল টাইপিংয়ের উপস্থিতি হ'ল সম্পূর্ণ টাইপ অনুমানের অনুমতি দেয় (এটি হ'ল প্রতিটি ধরণের অভিব্যক্তির জন্য সফল টাইপের অনুক্রম, কোনও প্রকারের টিকা ছাড়াই প্রয়োজন)। প্রিন্সিপাল টাইপিং (যার মধ্যে অনেকগুলি রয়েছে) ভঙ্গ করে এমন এক্সটেনশনগুলি প্রকারের অনুক্রমের সম্পূর্ণতাও ভেঙে দেয়।


7
lএকটি একক বর্ণের পরিবর্তনশীল হিসাবে ব্যবহার করবেন না , এটির থেকে পার্থক্য করা খুব কঠিন 1!
recursion.ninja

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

3
@ ডার্কটটার আমি সচেতন Typeable, কিন্তু হাস্কেল ২০১০ এর নেই (সম্ভবত হাস্কেল ২০১৪ হবে?)
পুঠারিয়ার শিখা

5
(বন্ধ) যোগফলের প্রকারগুলি সম্পর্কে কী? তারা এনকোডিং সীমাবদ্ধতার জন্য আরও গুরুত্বপূর্ণ একটি কৌশল।
tibbe

3
Nullability? সাউন্ডনেস (কোন covariance sillinses না)? সমষ্টি টাইপ / প্যাটার্ন ম্যাচ বন্ধ? এই উত্তরটি খুব সরু
পিকার

32

জাভা টাইপ সিস্টেমে উচ্চ ধরণের বহুবচন; হাস্কেলের টাইপ সিস্টেমে এটি রয়েছে।

অন্য কথায়: জাভাতে, টাইপ কনস্ট্রাক্টররা প্রকারভেদে বিমূর্ত করতে পারে তবে টাইপ কনস্ট্রাক্টরের চেয়ে বেশি নয়, যেখানে হাস্কেল-এ টাইপ কনস্ট্রাক্টর টাইপ কনস্ট্রাক্টর ও টাইপের উপরও অ্যাবস্ট্রাক্ট করতে পারে।

ইংরাজীতে: জাভাতে একটি জেনেরিক আর একটি জেনেরিক ধরণ নিতে পারে না এবং এটি প্যারামিটারাইজ করতে পারে না,

public void <Foo> nonsense(Foo<Integer> i, Foo<String> j)

হাস্কেল থাকাকালীন এটি বেশ সহজ

higherKinded :: Functor f => f Int -> f String
higherKinded = fmap show

28
আমাদের যে আবার চালাচ্ছেন, এবার ইংরেজিতে? : পি
ম্যাসন হুইলারের

8
@Matt: উদাহরণস্বরূপ আমি এই জাভা লিখতে পারেন, কিন্তু আমি মধ্যে Haskell সমতুল্য লিখতে পারেন: <T<_> extends Collection> T<Integer> convertStringsToInts(T<string> strings)। এখানে ধারণাটি convertStringsToInts<ArrayList>হ'ল যে কেউ যদি এটি হিসাবে ডাকে এটি স্ট্রিংগুলির একটি অ্যারেলিস্ট গ্রহণ করে এবং পূর্ণসংখ্যার একটি অ্যারেলিস্ট ফিরিয়ে দেয়। এবং যদি তারা পরিবর্তে ব্যবহার করে তবে পরিবর্তে convertStringsToInts<LinkedList>লিঙ্কযুক্ত তালিকার সাথে এটি একই হবে।
sepp2k

8
1 ম বনাম এন-র পরিবর্তে এই উচ্চ-ধরণের বহুবর্ষ কি নয়?
আদম

8
@ জার্গডব্লিউমিত্যাগ: আমার বোধগম্যতা হল যে উচ্চ-স্তরের বহুবর্ষবাদ উদ্বেগ যেখানে আপনি forallআপনার প্রকারগুলি রাখতে পারেন। মধ্যে Haskell, একটি টাইপ a -> bপরোক্ষভাবে হয় forall a. forall b. a -> b। একটি এক্সটেনশনের সাহায্যে আপনি এগুলি forallস্পষ্ট করে তুলতে পারেন এবং এগুলি চারপাশে স্থানান্তর করতে পারেন ।
টিখন জেলভিস

8
@ অ্যাডাম কঠোর: উচ্চ পদ এবং উচ্চতর ধরণের সম্পূর্ণ ভিন্ন। জিএইচসি কিছু ভাষা বর্ধনের সাহায্যে উচ্চতর র‌্যাঙ্কড ধরণের (অর্থাত্ ফোরাল প্রকারগুলি )ও করতে পারে। জাভা উচ্চতর ধরণের বা উচ্চতর র‌্যাঙ্কের প্রকারগুলিও জানেন না।
ইনগো

11

অন্যান্য উত্তরগুলির পরিপূরক হিসাবে, জাভের মতো হেস্কেলের টাইপ সিস্টেমে সাব টাইপিং নেই , যখন টাইপ করা বস্তুমুখী ভাষা।

ইন প্রোগ্রামিং ভাষা তত্ত্ব , subtyping (এছাড়াও পলিমরফিজম উপপ্রকার বা অন্তর্ভুক্তি পলিমরফিজম এক ধরনের) টাইপ পলিমরফিজম যেখানে একজন উপপ্রকার একটি হল ডাটাটাইপ যে অন্য ডাটাটাইপ (সঙ্গে সম্পর্কযুক্ত supertype কিছু ধারণা করে) substitutability , যার মানে হল প্রোগ্রাম উপাদান, সাধারণত সাবরুটিনের বা ফাংশন, সুপার টাইপের উপাদানগুলিতে পরিচালিত লিখিতভাবে সাব টাইপের উপাদানগুলিতেও কাজ করতে পারে। যদি এস টি টির একটি উপপ্রকার হয়, তবে সাব টাইপিং সম্পর্কটি প্রায়শই এস <: টি লেখা হয়, এর অর্থ এস যে কোনও ধরণের শব্দটি নিরাপদে কোনও প্রসঙ্গে ব্যবহার করা যেতে পারে যেখানেটাইপ টি এর একটি শব্দ আশা করা যায়। গুরুতরভাবে সাবটিপিংয়ের সুনির্দিষ্ট শব্দার্থবিজ্ঞান প্রদত্ত প্রোগ্রামিং ভাষায় "যেখানে একটি প্রসঙ্গে নিরাপদে ব্যবহৃত হয়েছে" তার অর্থের বিবরণ নির্ভর করে। টাইপ সিস্টেম একটি প্রোগ্রামিং ভাষার মূলত নিজস্ব subtyping সম্পর্ক, যা ভাল তুচ্ছ হতে পারে সংজ্ঞায়িত করে।

সাব-টাইপিং সম্পর্কের কারণে, একটি শব্দ একাধিক প্রকারের হতে পারে। সাবটাইপিং তাই একধরণের পলিমারফিজম। অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ে 'পলিমারফিজম' শব্দটি সাধারণত এই সাব টাইপ পলিমারফিজমকে বোঝাতে ব্যবহৃত হয় , যখন প্যারামেট্রিক পলিমারফিজমের কৌশলগুলি জেনেরিক প্রোগ্রামিং হিসাবে বিবেচিত হবে ...


4
যদিও এর অর্থ এই নয় যে আপনি অ্যাডহক পলিমারফিজম পাবেন না। আপনি কেবল অন্যরকম ফর্মে (সাব টাইপ পলিমারফিজমের পরিবর্তে ক্লাস টাইপ করুন) করুন।

3
সাবক্লাসিং সাবটিপিং করছে না!
ফ্রাঙ্ক শিয়ার 17

8

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

লোকেরা এখনও পর্যন্ত উল্লেখ করেছে বলে মনে হয় না তা হ'ল বীজগণিত ডেটা ধরণের। এটি হ'ল, বিভিন্ন ধরণের পরিমাণ ('বা') এবং পণ্য ('এবং') থেকে ধরণের তৈরির ক্ষমতা। জাভা ক্লাসগুলি পণ্যগুলি (ফিল্ড এ এবং ফিল্ড বি, বলুন) জরিমানা করে। তবে তারা প্রকৃতপক্ষে অঙ্কগুলি করে না (ক্ষেত্রের একটি OR ফিল্ড বি, বলুন)। স্কালাকে একাধিক কেস ক্লাস হিসাবে এটি এনকোড করতে হবে, যা একেবারে এক নয়। এবং এটি স্কালার পক্ষে কাজ করার সময় এটি জাভা রয়েছে বলে কিছুটা প্রসারিত।

হ্যাসেল ফাংশন নির্মাণকারী, -> ব্যবহার করে ফাংশনের ধরণগুলিও তৈরি করতে পারে। জাভার পদ্ধতিগুলিতে স্বাক্ষর টাইপ করার সময় আপনি সেগুলি একত্রিত করতে পারবেন না।

জাভার টাইপ সিস্টেম হাস্কেলকে না পেয়ে এমন এক ধরণের মড্যুলারিটি সক্ষম করে । হাস্কেলের জন্য একটি ওএসজি আসার আগে এটি হবে কিছুক্ষণ।


1
@ ম্যাটফেনউইক, আমি আপনার মতামতের ভিত্তিতে ২ য় অনুচ্ছেদটি সংশোধন করেছি। দুই ধরণের সিস্টেমগুলি খুব আলাদাভাবে ফাংশনগুলি আচরণ করে।
গ্যারেথআর

আমি ADT গুলি টাইপ সিস্টেমের একটি বৈশিষ্ট্য কল করব না। আপনি সম্পূর্ণরূপে (যদি বিশ্রীভাবে) OO মোড়কের সাহায্যে এগুলি অনুকরণ করতে পারেন।

@ বামদিকের দিক থেকে আমার মনে হয় এটি বিতর্কিত। উদাহরণস্বরূপ, এমন কিছু জিনিস থাকতে পারে যা এক ভাষার টাইপ সিস্টেমে স্থানীয়, তবে অন্য একটিতে নকশার নিদর্শন প্রয়োগ করা যেতে পারে। স্পষ্টতই, দেশীয় একের সাথে তুলনা করে নকশার প্যাটার্ন পদ্ধতিটি একটি কার্যক্ষম। একটি দুর্বল টাইপ সিস্টেমের কারণে কার্যকারিতা।
হাই-এঞ্জেল

নির্বাচিত উত্তরটিতে 'প্রিন্সিপাল টাইপিং' বিভাগে 'সম্পূর্ণ টাইপ অনুমানের' উল্লেখ করা হয়েছে। জাভা সাব টাইপস এবং রানটাইম টাইপ তথ্যের সাথে অঙ্কের পরিমাণগুলি সাজিয়ে তুলতে পারে তবে আপনি যেটা বলেছিলেন এটি যোগফলটি টাইপ সিস্টেমের একটি সামগ্রিক বৈশিষ্ট্য নয়।
শেলবি মুর তৃতীয়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.