স্কালায় একটি "প্রসঙ্গ আবদ্ধ" কী?


115

স্কেলা ২.৮ এর নতুন বৈশিষ্ট্যগুলির একটি হ'ল প্রসঙ্গের সীমা। কোন প্রসঙ্গ আবদ্ধ এবং এটি কোথায় কার্যকর?

অবশ্যই আমি প্রথম অনুসন্ধান (এবং উদাহরণস্বরূপ পাওয়া এই ) কিন্তু আমি কোনো সত্যিই স্পষ্ট এবং বিস্তারিত তথ্য খুঁজে পাইনি।


8
সমস্ত ধরণের সীমানার ট্যুরের জন্যও এটি পরীক্ষা করে দেখুন: gist.github.com/257758/47f06f2f3ca47702b3a86c76a5479d096cb8c7ec
আরজান

2
এই চমৎকার উত্তর / বৈপরীত্য প্রসঙ্গ সীমা এবং দেখুন সীমার তুলনা stackoverflow.com/questions/4465948/...
হারুন Novstrup

এটি একটি খুব সুন্দর উত্তর stackoverflow.com/a/25250693/1586965
samthebest

উত্তর:


107

আপনি এই নিবন্ধটি খুঁজে পেয়েছেন ? এটি অ্যারে উন্নতির প্রসঙ্গে, নতুন প্রসঙ্গে আবদ্ধ বৈশিষ্ট্যটি কভার করে।

সাধারণত, প্রসঙ্গে আবদ্ধ একটি ধরণের পরামিতি ফর্মের হয় [T: Bound]; এটি প্রসারিত ধরণের প্যারামিটারের সাথে Tএকসাথে প্লেইন টাইপ প্যারামিটারে প্রসারিত হয় Bound[T]

পদ্ধতিটি বিবেচনা করুন tabulateযা একটি প্রদত্ত ফাংশন এফ প্রয়োগের ফলাফল থেকে 0 থেকে একটি নির্দিষ্ট দৈর্ঘ্য পর্যন্ত একটি পরিসীমাটিতে অ্যারে গঠন করে Consider স্কেল ২.7 অবধি, ট্যাবুলেটটি নিম্নরূপ লেখা যেতে পারে:

def tabulate[T](len: Int, f: Int => T) = {
    val xs = new Array[T](len)
    for (i <- 0 until len) xs(i) = f(i)
    xs
}

স্কেলা ২.৮ এ এটি আর সম্ভব নয়, কারণ সঠিক সময় উপস্থাপনের জন্য রানটাইম তথ্য প্রয়োজনীয় Array[T]ClassManifest[T]অন্তর্নিহিত পরামিতি হিসাবে পদ্ধতিতে পাস করে একজনকে এই তথ্য সরবরাহ করতে হবে :

def tabulate[T](len: Int, f: Int => T)(implicit m: ClassManifest[T]) = {
    val xs = new Array[T](len)
    for (i <- 0 until len) xs(i) = f(i)
    xs
}

একটি শর্টহ্যান্ড ফর্ম হিসাবে, প্রসঙ্গের সীমাটি Tপরিবর্তিত প্যারামিটারের পরিবর্তে ব্যবহার করা যেতে পারে :

def tabulate[T: ClassManifest](len: Int, f: Int => T) = {
    val xs = new Array[T](len)
    for (i <- 0 until len) xs(i) = f(i)
    xs
}

145

রবার্টের উত্তর কনটেক্সট বাউন্ডের প্রযুক্তিগত বিবরণকে কভার করে। আমি তাদের অর্থ সম্পর্কে আমার ব্যাখ্যা দেব।

স্কালায় একটি ভিউ বাউন্ড ( A <% B) 'হিসাবে দেখা যেতে পারে' এর ধারণাকে ক্যাপচার করে (যেখানে একটি ওপরের সীমানা <:'' এ '' এর ধারণাকে ধারণ করে)। একটি প্রসঙ্গ আবদ্ধ ( A : C) বলে একটি প্রকার সম্পর্কে 'একটি' আছে। আপনি " Tএকটি আছে Manifest" হিসাবে উদ্ভাসের উদাহরণগুলি পড়তে পারেন । আপনি প্রায় Orderedবনামের সাথে সংযুক্ত উদাহরণটি Orderingপার্থক্যের চিত্রণ করে rates একটি পদ্ধতি

def example[T <% Ordered[T]](param: T)

যে পরামিতি একটি হিসাবে দেখা যেতে পারে বলে Ordered। তুলনা করা

def example[T : Ordering](param: T)

যা বলে যে প্যারামিটারটির একটি যুক্ত রয়েছে Ordering

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

দেখার সীমা এবং প্রসঙ্গের সীমা সম্পর্কে চিন্তা করার আর একটি উপায় হ'ল প্রথমটি কলারের সুযোগ থেকে নিখুঁত রূপান্তর স্থানান্তর করে। দ্বিতীয়টি কলারের সুযোগ থেকে অন্তর্নিহিত বস্তু স্থানান্তর করে।


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

1
@ বেন লিংস এর অর্থ কী ... .... 'টাইপ' সম্পর্কে 'একটি' রয়েছে ...? এক প্রকার সম্পর্কে কী ?
heেগেদুস

1
@ জেগেদাস এখানে আমার পার্সিং: "টাইপ সম্পর্কে" এর অর্থ হ'ল ক একটি প্রকারকে বোঝায়। "একটি আছে" শব্দগুচ্ছটি প্রায়শই অবজেক্ট-ওরিয়েন্টড ডিজাইনে অবজেক্টের সম্পর্কের বর্ণনা দেওয়ার জন্য ব্যবহৃত হয় (যেমন গ্রাহকের "একটি" ঠিকানা রয়েছে)। তবে এখানে "একটি" সম্পর্কটি প্রকারের মধ্যে, বস্তুর নয়। এটি একটি আলগা উপমা কারণ ওও ডিজাইনের ক্ষেত্রে "একটি" সম্পর্ক সহজাত বা সর্বজনীন নয়; গ্রাহকের সর্বদা একটি ঠিকানা থাকে তবে প্রসঙ্গের সাথে আবদ্ধ হওয়ার জন্য এ এর ​​সর্বদা সি থাকে না বরং প্রসঙ্গের সীমাটি নির্দিষ্ট করে যে সি [এ] এর একটি উদাহরণ অবশ্যই স্পষ্টভাবে সরবরাহ করা উচিত।
jbyler

আমি এক মাস ধরে স্কেলা শিখছি, এবং এটিই এই মাসে আমি সবচেয়ে ভাল ব্যাখ্যা দেখেছি! ধন্যবাদ @ বেন!
লিফু হুয়াং

@ ল্যাং লিংস: ধন্যবাদ, প্রসঙ্গে আবদ্ধ বিষয়টি বোঝার জন্য এত দীর্ঘ সময় ব্যয় করার পরে, আপনার উত্তরটি খুব সহায়ক [[ has aআমার কাছে আরও বোঝা যায়]
শঙ্কর

39

(এটি একটি প্যারেন্থিকাল নোট। অন্যান্য উত্তরগুলি আগে পড়ুন এবং বুঝুন))

প্রসঙ্গের বাউন্ডগুলি প্রকৃতপক্ষে ভিউ সীমাগুলিকে সাধারণীকরণ করে।

সুতরাং, এই কোডটি একটি সীমাবদ্ধতার সাথে প্রকাশিত হয়েছে:

scala> implicit def int2str(i: Int): String = i.toString
int2str: (i: Int)String

scala> def f1[T <% String](t: T) = 0
f1: [T](t: T)(implicit evidence$1: (T) => String)Int

এটি টাইপ থেকে টাইপ Fকরে ফাংশন উপস্থাপনকারী কোনও টাইপের ওরফে সহায়তার সাথে প্রসঙ্গে বাউন্ড দিয়েও প্রকাশ করা যেতে পারে T

scala> trait To[T] { type From[F] = F => T }           
defined trait To

scala> def f2[T : To[String]#From](t: T) = 0       
f2: [T](t: T)(implicit evidence$1: (T) => java.lang.String)Int

scala> f2(1)
res1: Int = 0

প্রবন্ধের আবদ্ধ একটি প্রকারের নির্মাণকারীর সাথে অবশ্যই ব্যবহার করা উচিত * => *। তবে টাইপ কনস্ট্রাক্টর Function1ধরনের হয় (*, *) => *। প্রকার বাছাইয়ের Stringজন্য ব্যবহারের জন্য সঠিক ধরণের একটি নির্মাণকারীর ফলন সহ প্রকারভেদটির ব্যবহার আংশিকভাবে প্রকারের সাথে দ্বিতীয় ধরণের পরামিতি প্রয়োগ করে।

কোনও বৈশিষ্ট্যের অভ্যন্তরে প্রকারের উপনামটি ব্যবহার না করে আপনাকে স্ক্যালায় আংশিক প্রয়োগিত প্রকারগুলি সরাসরি প্রকাশ করার অনুমতি দেওয়ার প্রস্তাব রয়েছে। আপনি তখন লিখতে পারেন:

def f3[T : [X](X => String)](t: T) = 0 

আপনি কি F2 এর সংজ্ঞাতে #From এর অর্থ ব্যাখ্যা করতে পারেন? আমি নিশ্চিত নই যে এফ টাইপটি কোথায় তৈরি হচ্ছে (আমি কি এটি সঠিকভাবে বলেছি?)
কলিন

1
এটিকে টাইপ প্রজেকশন বলা হয়, প্রকারের কোনও ধরণের সদস্যকে উল্লেখ Fromকরে To[String]। আমরা এতে কোনও ধরণের আর্গুমেন্ট সরবরাহ করি না From, তাই আমরা প্রকারটি নয়, প্রকারের কনস্ট্রাক্টরকে উল্লেখ করি। এই ধরণের কনস্ট্রাক্টর প্রসঙ্গের সীমাবদ্ধ হিসাবে ব্যবহার করতে সঠিক ধরণের * -> *। এটি প্রকারের Tএকটি অন্তর্নিহিত প্যারামিটারের প্রয়োজনের মাধ্যমে টাইপ প্যারামিটারকে সীমাবদ্ধ করে To[String]#From[T]। প্রকারের উপকরণ এবং ভয়েলা প্রসারিত করুন, আপনার সাথে বাকী রয়েছে Function1[String, T]
retronym

এটি ফাংশন 1 [টি, স্ট্রিং] হওয়া উচিত?
ssanj

18

এটি অন্য প্যারেন্টিথিকাল নোট।

বেন নির্দেশিত হিসাবে , প্রসঙ্গের গণ্ডি একটি টাইপ প্যারামিটার এবং একটি টাইপ শ্রেণীর মধ্যে একটি "হ্যাস-এ" সীমাবদ্ধতা উপস্থাপন করে। অন্যভাবে রাখুন, এটি একটি সীমাবদ্ধতা উপস্থাপন করে যে কোনও নির্দিষ্ট ধরণের শ্রেণীর অন্তর্নিহিত মান বিদ্যমান।

প্রাসঙ্গিক প্রসঙ্গটি ব্যবহার করার সময়, একজনকে প্রায়শই সেই অন্তর্নিহিত মানটির পৃষ্ঠের প্রয়োজন হয়। উদাহরণস্বরূপ, সীমাবদ্ধতা প্রদত্ত T : Ordering, একজনকে প্রায়শই Ordering[T]এর সীমাবদ্ধতাটি সন্তুষ্ট করার উদাহরণটির প্রয়োজন হবে । এখানে প্রদর্শিত হিসাবে , implicitlyপদ্ধতি বা কিছুটা বেশি সহায়ক contextপদ্ধতি ব্যবহার করে অন্তর্নিহিত মানটি অ্যাক্সেস করা সম্ভব :

def **[T : Numeric](xs: Iterable[T], ys: Iterable[T]) = 
   xs zip ys map { t => implicitly[Numeric[T]].times(t._1, t._2) }

অথবা

def **[T : Numeric](xs: Iterable[T], ys: Iterable[T]) =
   xs zip ys map { t => context[T]().times(t._1, t._2) }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.