স্কালায় উচ্চতর ধরণের কী?


275

আপনি ওয়েবে নিম্নলিখিত সন্ধান করতে পারেন:

  1. উচ্চ ধরণের টাইপ == টাইপ কনস্ট্রাক্টর?

    class AClass[T]{...} // For example, class List[T]

    কেউ কেউ বলেন যে এটি একটি উচ্চ ধরণের প্রকারের, কারণ এটি প্রকারের সংক্ষিপ্ত বিবরণ যা সংজ্ঞা অনুসারে মেনে চলবে।

    উচ্চতর ধরণের প্রকারগুলি হ'ল প্রকার যা অন্য ধরণের হয় এবং একটি নতুন ধরণের তৈরি করে

    এগুলি যদিও টাইপ কনস্ট্রাক্টর হিসাবে পরিচিত । (উদাহরণস্বরূপ, স্কেলে প্রোগ্রামিংয়ে )।

  2. উচ্চতর ধরণের টাইপ == টাইপ কনস্ট্রাক্টর যা টাইপ কনস্ট্রাক্টরকে টাইপ প্যারামিটার হিসাবে গ্রহণ করে?

    কাগজে একটি উচ্চ কাইন্ড অফ জেনেরিক্স , আপনি পড়তে পারেন

    ... প্রকারভেদে বিমূর্ত যে ধরণের প্রকারের উপর বিমূর্ততা রয়েছে ('উচ্চ-ধরণের ধরণের') ... "

    যা পরামর্শ দেয়

    class XClass[M[T]]{...} // or
    
    trait YTrait[N[_]]{...} // e.g. trait Functor[F[_]]
    

    একটি উচ্চ ধরণের ধরণের।

সুতরাং এটি মনে রেখে, টাইপ কনস্ট্রাক্টর , উচ্চতর ধরণের এবং টাইপ কনস্ট্রাক্টরের মধ্যে পার্থক্য করা কঠিন যা টাইপ কনস্ট্রাক্টরকে টাইপ প্যারামিটার হিসাবে গ্রহণ করে , সুতরাং উপরের প্রশ্নটি।


উদাহরণ হিসাবে ল্যান্ডির ফান্টেক্টর যুক্ত করা হয়েছে।
লুটজ

উত্তর:


284

আমাকে কিছু বিশৃঙ্খলা নিয়ে পিচ করে এই বিভ্রান্তির কিছুটা শুরু করার জন্য প্রস্তুত করি। আমি এটি ব্যাখ্যা করতে মান স্তরের উপমাটি ব্যবহার করতে চাই, কারণ লোকেরা এর সাথে আরও পরিচিত হতে থাকে more

একটি টাইপ কনস্ট্রাক্টর এমন এক প্রকার যা আপনি কোনও প্রকারের "কন্ট্রাক্ট" করতে আর্গুমেন্ট টাইপ করতে প্রয়োগ করতে পারেন।

একটি মান নির্মাতা এমন একটি মান যা আপনি একটি মান "কন্সট্রাক্ট" করার জন্য মূল্য যুক্তিগুলিতে প্রয়োগ করতে পারেন।

মান নির্মাতাদের সাধারণত "ফাংশন" বা "পদ্ধতি" বলা হয়। এই "কনস্ট্রাক্টর "গুলিকে" পলিমারফিক "ও বলা হয় (কারণ এগুলি "আকৃতির" বিভিন্ন "স্টাফ" তৈরি করতে ব্যবহার করা যেতে পারে), বা "বিমূর্তি" (যেহেতু তারা বিভিন্ন পলিমারফিক ইনস্ট্যান্টেশনের মধ্যে পরিবর্তিত হয় সে সম্পর্কে বিমূর্ততা দেয়)।

বিমূর্ততা / বহুবিজ্ঞানের প্রসঙ্গে, প্রথম-ক্রমটি বিমূর্তির "একক ব্যবহার" বোঝায়: আপনি একবারে কোনও প্রকারের উপর বিমূর্ত করেন তবে সেই প্রকারটি নিজেই কোনও কিছুর উপর বিমূর্ততা রাখতে পারে না। জাভা 5 জেনেরিকগুলি প্রথম-ক্রম।

উপরের বিমূর্ততার বৈশিষ্ট্যগুলির প্রথম ক্রমের ব্যাখ্যাটি হ'ল:

একটি টাইপ কনস্ট্রাক্টর এমন এক প্রকার যা আপনি সঠিক টাইপ "কনস্ট্রাক্ট" করতে উপযুক্ত টাইপ আর্গুমেন্টে প্রয়োগ করতে পারেন।

একটি মান নির্মাতা একটি মান যা আপনি যথাযথ মান "নির্মাণ" করার জন্য যথাযথ মান তর্কগুলিতে প্রয়োগ করতে পারেন।

জোর দেওয়ার জন্য কোনও বিমূর্ততা জড়িত নেই (আমি অনুমান করি আপনি এটি "শূন্য-ক্রম" বলতে পারেন, তবে আমি এটি কোথাও ব্যবহার করে দেখিনি) যেমন মান 1বা প্রকার String, আমরা সাধারণত বলি যে কোনও কিছু "যথাযথ" মান বা প্রকার।

একটি উপযুক্ত মান "তাত্ক্ষণিকভাবে ব্যবহারযোগ্য" এই অর্থে যে এটি আর্গুমেন্টের জন্য অপেক্ষা করছে না (এটি তাদের উপর বিমূর্ত নয়)। এগুলি এমন মান হিসাবে ভাবেন যা আপনি সহজেই মুদ্রণ / পরিদর্শন করতে পারেন (কোনও ক্রিয়াকলাপটি প্রতারণা করছে!) Serial

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

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

সুতরাং, আমাদের বৈশিষ্ট্যটির উচ্চতর ক্রমের সংস্করণটি হয়ে যায়:

একটি টাইপ কনস্ট্রাক্টর এমন এক প্রকার যা আপনি যথাযথ টাইপ (কনস্ট্রাক্টর) "নির্মাণ" করার জন্য আর্গুমেন্ট (সঠিক টাইপ বা কনস্ট্রাক্টর) টাইপ করতে প্রয়োগ করতে পারেন।

একটি মান কন্সট্রাক্টর এমন একটি মান যা আপনি যথাযথ মান (কনস্ট্রাক্টর) "নির্মাণ" করতে আর্গুমেন্টের (যথাযথ মান বা মান নির্মাতাদের) প্রয়োগ করতে পারেন।

সুতরাং, "উচ্চতর-আদেশ" এর সহজ অর্থ হ'ল আপনি যখন "এক্স ওমাস্ট্রাক্টিং এক্স" বলছেন, আপনি সত্যিকার অর্থে এটি বোঝাচ্ছেন! Xকরতে বিমূর্ত এটা সব চায়: ওভার আনমনা যে তার নিজস্ব "বিমূর্ততা অধিকারসমূহ" হারান না। (উপায় দ্বারা, আমি এখানে "বিমূর্ত" ক্রিয়াটি ব্যবহার করে বোঝাতে চাইছি: কোনও মান বা প্রকারের সংজ্ঞা দেওয়ার জন্য প্রয়োজনীয় নয় এমন কিছু রেখে দিতে, যাতে এটি বিমূর্ততার ব্যবহারকারীর দ্বারা আর্গুমেন্ট হিসাবে পরিবর্তিত / সরবরাহ করা যায় ।)

যথাযথ, প্রথম-আদেশ এবং উচ্চতর অর্ডার মান এবং প্রকারের কয়েকটি উদাহরণ (ইমেল দ্বারা লুটসের প্রশ্ন দ্বারা অনুপ্রাণিত):

                   proper    first-order           higher-order

values             10        (x: Int) => x         (f: (Int => Int)) => f(10)
types (classes)    String    List                  Functor
types              String    ({type λ[x] = x})#λ   ({type λ[F[x]] = F[String]})#λ

যেখানে ব্যবহৃত ক্লাসগুলি সংজ্ঞায়িত করা হয়েছিল:

class String
class List[T]
class Functor[F[_]]

সংজ্ঞায়িত ক্লাসগুলির মাধ্যমে নির্দেশনা এড়াতে আপনার কোনওভাবে বেনাম প্রকারের ক্রিয়াকলাপগুলি প্রকাশ করা দরকার যা সরাসরি স্কালায় প্রকাশযোগ্য নয়, তবে আপনি খুব বেশি সিনট্যাকটিক ওভারহেড ছাড়াই কাঠামোগত ধরণের ব্যবহার করতে পারেন ( স্টাইলটি https://stackoverflow.com এর কারণে হয় / ব্যবহারকারী / 160378 / রেট্রোনিম আফাইক):

বেনামি ধরণের ফাংশন সমর্থন করে এমন স্কেলার ভবিষ্যতের কিছু অনুমানের সংস্করণে, আপনি উদাহরণ থেকে শেষ লাইনটি সংক্ষেপণ করতে পারেন:

types (informally) String    [x] => x              [F[x]] => F[String]) // I repeat, this is not valid Scala, and might never be

(একটি ব্যক্তিগত নোটে, আমি কখনও আফসোস করি যে "উচ্চ ধরণের ধরণের" সম্পর্কে কথা বলার পরে সেগুলি কেবল টাইপস! আপনি যখন একেবারে বিস্মৃত হওয়া প্রয়োজন তখন আমি "টাইপ কনস্ট্রাক্টর প্যারামিটার", "টাইপ কনস্ট্রাক্টর মেম্বার") এর মত কথা বলার পরামর্শ দিই , বা "টাইপ কনস্ট্রাক্টর ওরফে", এটি জোর দেওয়ার জন্য যে আপনি কেবল সঠিক ধরণের কথা বলছেন না))

PS: বিষয়গুলিকে আরও জটিল করার জন্য, "পলিমারফিক" আলাদাভাবে অস্পষ্ট, যেহেতু পলিমারফিক টাইপের অর্থ মাঝে মাঝে একটি সর্বজনীন পরিমাণযুক্ত প্রকার, যেমন Forall T, T => Tএকটি যথাযথ প্রকার, কারণ এটি বহুবর্ষীয় মানগুলিকে শ্রেণিবদ্ধ করে (স্কালায়, এই মানটি হতে পারে) কাঠামোগত ধরণ হিসাবে লিখিত {def apply[T](x: T): T = x})



5
অ্যাড্রিয়ানের "টাইপ কনস্ট্রাক্টর্ট পলিমারফিজম
স্টিভেন শ

আমি এটিকে উচ্চতর আত্মীয় হিসাবে পড়তে এবং এক আত্মীয় আত্মার কল্পনা করতে
থাকি

110

(এই উত্তরটি কিছু গ্রাফিকাল এবং historicalতিহাসিক তথ্যের দ্বারা অ্যাড্রিয়ায়ান মোরস উত্তরটি সাজানোর চেষ্টা attempt)

উচ্চ ধরণের ধরণেরগুলি 2.5 থেকে স্কালার অংশ।

  • স্ক্যালার আগে, জাভা হিসাবে এখন অবধি, টাইপ কনস্ট্রাক্টরকে টাইপ কনস্ট্রাক্টর (জাভাতে "জেনারিকস") ব্যবহার করার অনুমতি দেয়নি। যেমন

     trait Monad [M[_]]

    সম্ভব ছিল না।

    স্কেল 2.5 তে টাইপ সিস্টেমটি একটি উচ্চ স্তরের ( ধরণের নির্মাণকারী পলিমারফিজম হিসাবে পরিচিত ) ধরণের শ্রেণিবদ্ধকরণের ক্ষমতা দ্বারা প্রসারিত হয়েছিল । এই শ্রেণিবিন্যাসগুলি ধরণের হিসাবে পরিচিত।

    টাইপ করুন এবং ধরনের রিয়েলেশন, ** "উচ্চতর ধরণের জেনারিকস" থেকে প্রাপ্ত ** ( উচ্চতর ধরণের জেনারিক্স থেকে প্রাপ্ত ছবি )

    ফলাফলটি হ'ল, সেই ধরণের কনস্ট্রাক্টর (যেমন List) টাইপ কনস্ট্রাক্টরগুলির টাইপ প্যারামিটার পজিশনে অন্য ধরণের হিসাবে ব্যবহার করা যেতে পারে এবং সুতরাং তারা স্কেলা 2.5 এর পরে প্রথম শ্রেণীর ধরণে পরিণত হয়েছিল। (স্কালায় প্রথম শ্রেণীর মানগুলির মতো ক্রিয়াকলাপ)।

    একটি টাইপ সিস্টেম উচ্চতর ধরণের সমর্থন প্রসঙ্গে, আমরা আলাদা করতে পারেন সঠিক ধরনের , ধরন মত Intবা List[Int]মত প্রথম অর্ডার ধরনের Listএবং একটি উচ্চ ধরনের ধরনের মত Functorবা Monad(ধরনের যা প্রকারের বিমূর্ত যা প্রকারের বিমূর্ত)।

    অন্যদিকে জাভা টাইপ সিস্টেম ধরণের সমর্থন করে না এবং তাই "উচ্চতর ধরণের" কোনও ধরণের নেই।

    সুতরাং এটি সমর্থনকারী টাইপ সিস্টেমের পটভূমির বিপরীতে দেখতে হবে।

  • স্কেলার ক্ষেত্রে আপনি প্রায়শই পছন্দ মতো কোনও নির্মাণকারীর উদাহরণ দেখতে পান

     trait Iterable[A, Container[_]]

    "উচ্চতর ধরণের ধরণের" শিরোনাম সহ, যেমন জেনেরিক প্রোগ্রামারগুলির স্কালায়, বিভাগ 4.3 4.

    এটি কখনও কখনও মিসলাইজিং হয়, কারণ অনেকগুলি উচ্চতর ধরণেরContainer হিসাবে উল্লেখ করে এবং না , তবে আরও সুনির্দিষ্টটি কী,Iterable

    ব্যবহারের Containerএকটি উচ্চ kinded (উচ্চতর-অর্ডার) হিসাবে টাইপ কন্সট্রাকটর প্যারামিটার এখানে লিখুন Iterable


80

ধরনের মতো সাধারণ ধরনের Intএবং Charযার দৃষ্টান্ত মান হল *। মত ইউনারী টাইপ কনস্ট্রাকটর ধরনের Maybeহয় * -> *; বাইনারি ধরণের নির্মাতারা যেমন Either( ত্রিযুক্ত ) ধরণের * -> * -> *ইত্যাদি করে। আপনি টাইপ-লেভেল ফাংশনগুলির মতো Maybeএবং এর Eitherমতো প্রকারগুলি দেখতে পারেন : তারা এক বা একাধিক প্রকার নেয় এবং কোনও প্রকার ফেরত দেয়।

একটি ফাংশন উচ্চতর-অর্ডার যদি এটি একটি হয়েছে অর্ডার 1 তার চেয়ে অনেক বেশী, যেখানে অর্ডার (অনানুষ্ঠানিকভাবে) পাখির গভীরতা বাঁদিকে, ফাংশন তীর হল:

  • অর্ডার 0: 1 :: Int
  • অর্ডার 1: chr :: Int -> Char
  • অর্ডার 2: fix :: (a -> a) -> a,map :: (a -> b) -> [a] -> [b]
  • অর্ডার 3: ((A -> B) -> C) -> D
  • অর্ডার 4: (((A -> B) -> C) -> D) -> E

সুতরাং, দীর্ঘ গল্প সংক্ষিপ্ত, একটি উচ্চ ধরণের ধরণের কেবল একটি টাইপ-লেভেল উচ্চ-অর্ডার ফাংশন।

  • অর্ডার 0: Int :: *
  • অর্ডার 1: Maybe :: * -> *
  • অর্ডার 2: Functor :: (* -> *) -> Constraintউচ্চতর ধরণের : অ্যানারি টাইপ কনস্ট্রাক্টরকে টাইপক্লাসের সীমাবদ্ধতায় রূপান্তর করে

ঠিক আছে, আমি এটি পেয়েছি, তারপরে স্ক্যালায় (* * ⇒ *) ⇒ * এবং (* * ⇒ *) ⇒ (* * ⇒ *) এর উদাহরণগুলি কী হবে? ল্যান্ডির ফান্টকারটি কি প্রথম বিভাগে বা দ্বিতীয় বিভাগে ফিট করে?
লুটজ

1
@ লুটজ: এটি প্রথম বিভাগে থাকবে: কোনও প্রকার নির্মাণকারীর কাছ থেকে একটি Functorসঠিক ধরণের (ভাল, বৈশিষ্ট্য, তবে একই ধারণা) Functor[F[_]]উত্পাদন করে F
জন পুর্ডি

1
@ জন: একটি খুব অন্তর্দৃষ্টিপূর্ণ পোস্ট, আপনাকে ধন্যবাদ। টাইপ রূপান্তরকারী (* => *) => (* => *)স্কালায় প্রকাশ করা যেতে পারে? না হলে অন্য কোন ভাষায়?
ইউজেন লাবুন

@ জোনপুর্দি কারিরিংয়ের * ⇒ * ⇒ *সাথে তুলনা করা খুব সহায়ক। ধন্যবাদ!
লিফু হুয়াং

(* ⇒ *) ⇒ (* ⇒ *)বানানও হতে পারে (* ⇒ *) ⇒ * ⇒ *। এটি স্কেলে মত প্রকাশ করা যেতে পারে Foo[F[_], T]। এই জাতীয় ধরণের (হাস্কেলের মধ্যে) newtype Twice f a = Twice (f (f a))(যেমন, Twice Maybe IntMaybe (Maybe Int), Twice [] Char[[Char]]) বা ফ্রি মোনাডের মতো আরও আকর্ষণীয় কিছু data Free f a = Pure a | Free (f (Free f a))
জন পুর্ডি

37

আমি বলব: একটি উচ্চতর ধরণের টাইপ নির্মাতার উপর বিমূর্ত করে । যেমন বিবেচনা

trait Functor [F[_]] {
   def map[A,B] (fn: A=>B)(fa: F[A]): F[B]
}

এখানে Functorএকটি "উচ্চতর ধরনের" রয়েছে (যেমন "উচ্চতর ধরণের জেনারিকস " কাগজে ব্যবহৃত হয় )। এটি কোনও কংক্রিট ("প্রথম-আদেশ") ধরণের নির্মাণকারী নয় List(যা কেবলমাত্র উপযুক্ত ধরণের উপরে বিমৃত)। এটি সমস্ত unary ("প্রথম অর্ডার") ধরণের নির্মাতাদের উপর বিমূর্ত করে (যেমন হিসাবে চিহ্নিত করা হয় F[_])।

বা এটি অন্যভাবে বলতে List<T>গেলে : জাভাতে আমাদের স্পষ্টরূপে নির্মাতারা টাইপ করেছেন (উদাহরণস্বরূপ ), তবে আমাদের কোনও "উচ্চতর ধরণের" নেই, কারণ আমরা তাদের উপর বিমূর্ততা রাখতে পারি না (যেমন আমরা Functorউপরে বর্ণিত ইন্টারফেসটি লিখতে পারি না - কমপক্ষে সরাসরি না )।

"উচ্চতর অর্ডার (টাইপ কনস্ট্রাক্টর) পলিমর্ফিজম" শব্দটি এমন সিস্টেমগুলি বর্ণনা করতে ব্যবহৃত হয় যা "উচ্চতর ধরণের ধরণের" সমর্থন করে।


এটি আমি যা ভেবেছিলাম তা কিন্তু জনের উত্তরের বিরোধী বলে মনে হচ্ছে, যেখানে "কংক্রিটের ধরণের নির্মাতা" ইতিমধ্যে "উচ্চতর ধরণের"।
লুটজ

3
হ্যাঁ. জনের উত্তর অনুসারে (আমি এটি বুঝতে পারি) List<T>জাভাতে একটি অকার্যকর টাইপ নির্মাতা হবে কারণ এটি স্পষ্টভাবে ধরণের রয়েছে * -> *। জনের উত্তরে যা অনুপস্থিত *তা হ'ল উচ্চতর ধরণের ধরণের নাম বলতে গেলে আপনাকে অবশ্যই "পুরো জিনিস" (এবং জাভা হিসাবে দ্বিতীয়টির চেয়ে বেশি নয় ) বিমূর্ত করতে সক্ষম হতে হবে।
ল্যান্ডেই

@ লন্ডাই: ৪.৩ বিভাগে জেনেরিক প্রোগ্রামারগুলির জন্য কাগজ স্কেলটি বৈশিষ্ট্যটি অপরিহার্য [এ, ধারক [_]] কে উচ্চতর ধরণের বলে বোঝানো হয়েছে (যদিও এটি স্পষ্ট নয় যে Iterator বা ধারক বোঝানো হয়েছে) যেখানে অন্যদিকে vero690 রয়েছে বিভাগ ২.৩.১ উচ্চতর ধরণের টাইপ কনস্ট্রাক্টর শব্দটি ব্যবহার করে যেমন (* -> *) -> * ( হাইপার -অর্ডার টাইপ কনস্ট্রাক্টরের সাথে টাইপ অপারেটর প্যারামিটারাইজড) যা আইট্রেটার বা আপনার ফান্ট্রিক বৈশিষ্ট্যের অনুরূপ।
লুৎজ

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

2
সাধারণভাবে এখানে সংজ্ঞা এবং রেফারেন্সের পার্থক্য করা গুরুত্বপূর্ণ। সংজ্ঞাটি def succ(x: Int) = x+1"মান succনির্মাতা " উপস্থাপন করে (আমি এর দ্বারা কী বোঝাতে চাইছি তার জন্য আমার অন্যান্য উত্তর দেখুন) (কেউ এই মানটিকে Succ (x: int) হিসাবে উল্লেখ করবে না)। সাদৃশ্য অনুসারে, Functorআপনার উত্তরে (প্রকৃতপক্ষে উচ্চতর ধরণের) সংজ্ঞা দেওয়া আছে। আবার, আপনি হিসাবে এটি পড়ুন করা উচিত নয় Functor[F[_]](কি Fকি? _তারা সুযোগ না হন দুর্ভাগ্যক্রমে, existentials muddies জন্য অন্বিত চিনি জলের এখানে করে! F[_]সংক্ষিপ্ত F[T forSome {type T}])
Adriaan মুর

0

স্কালা REPL :kindকমান্ড সরবরাহ করে যা

scala> :help kind

:kind [-v] <type>
Displays the kind of a given type.

উদাহরণ স্বরূপ,

scala> trait Foo[A]
trait Foo

scala> trait Bar[F[_]]
trait Bar

scala> :kind -v Foo
Foo's kind is F[A]
* -> *
This is a type constructor: a 1st-order-kinded type.

scala> :kind -v Foo[Int]
Foo[Int]'s kind is A
*
This is a proper type.

scala> :kind -v Bar
Bar's kind is X[F[A]]
(* -> *) -> *
This is a type constructor that takes type constructor(s): a higher-kinded type.

scala> :kind -v Bar[Foo]
Bar[Foo]'s kind is A
*
This is a proper type.

এর :helpস্পষ্ট সংজ্ঞা প্রদান করে তাই আমার মনে হয় এটি এখানে সম্পূর্ণরূপে পোস্ট করা উপযুক্ত (স্কেলা ২.১13.২)

scala> :help kind

:kind [-v] <type>
Displays the kind of a given type.

    -v      Displays verbose info.

"Kind" is a word used to classify types and type constructors
according to their level of abstractness.

Concrete, fully specified types such as `Int` and `Option[Int]`
are called "proper types" and denoted as `A` using Scala
notation, or with the `*` symbol.

    scala> :kind Option[Int]
    Option[Int]'s kind is A

In the above, `Option` is an example of a first-order type
constructor, which is denoted as `F[A]` using Scala notation, or
* -> * using the star notation. `:kind` also includes variance
information in its output, so if we ask for the kind of `Option`,
we actually see `F[+A]`:

    scala> :k -v Option
    Option's kind is F[+A]
    * -(+)-> *
    This is a type constructor: a 1st-order-kinded type.

When you have more complicated types, `:kind` can be used to find
out what you need to pass in.

    scala> trait ~>[-F1[_], +F2[_]] {}
    scala> :kind ~>
    ~>'s kind is X[-F1[A1],+F2[A2]]

This shows that `~>` accepts something of `F[A]` kind, such as
`List` or `Vector`. It's an example of a type constructor that
abstracts over type constructors, also known as a higher-order
type constructor or a higher-kinded type.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.