সিনট্যাকটিক সুবিধার্থে এককভাবে, সিঙ্গলটনের ধরণ, পাথ-নির্ভর ধরণের এবং অন্তর্নিহিত মানগুলির সংমিশ্রণের অর্থ স্ক্যালার নির্ভরশীল টাইপিংয়ের জন্য আশ্চর্যজনকভাবে ভাল সমর্থন রয়েছে, কারণ আমি নিরাকারে প্রদর্শন করার চেষ্টা করেছি ।
নির্ভরশীল ধরণের জন্য স্কালার অন্তর্নিহিত সমর্থন পথ-নির্ভর ধরণের মাধ্যমে । এগুলি কোনও ধরণের নির্বাচিত পাথের উপর নির্ভর করে কোনও বস্তুর মাধ্যমে (যেমন: মান-) গ্রাফের মাধ্যমে,
scala> class Foo { class Bar }
defined class Foo
scala> val foo1 = new Foo
foo1: Foo = Foo@24bc0658
scala> val foo2 = new Foo
foo2: Foo = Foo@6f7f757
scala> implicitly[foo1.Bar =:= foo1.Bar] // OK: equal types
res0: =:=[foo1.Bar,foo1.Bar] = <function1>
scala> implicitly[foo1.Bar =:= foo2.Bar] // Not OK: unequal types
<console>:11: error: Cannot prove that foo1.Bar =:= foo2.Bar.
implicitly[foo1.Bar =:= foo2.Bar]
আমার দৃষ্টিতে, উপরোক্ত প্রশ্নের উত্তর দেওয়ার জন্য যথেষ্ট হওয়া উচিত "" স্কালা কি নির্ভর করে টাইপ করা একটি ভাষা? " ধনাত্মক ক্ষেত্রে: এটি স্পষ্ট যে এখানে আমাদের ধরণের মান রয়েছে যা তাদের উপসর্গগুলির দ্বারা পৃথক করা হয়।
তবে এটি প্রায়শই আপত্তি জানায় যে স্কালার কোনও "সম্পূর্ণ" নির্ভরশীল টাইপ ভাষা নয় কারণ এর মধ্যে নির্ভরযোগ্য যোগফল এবং প্রকারের প্রকার যেমন আগদা বা কোক বা ইদ্রিসের মধ্যে অন্তর্নিহিত হিসাবে পাওয়া যায় না। আমি মনে করি এটি ফান্ডামিনালগুলির চেয়ে কিছুটা হলেও ফর্মের স্থিরতার প্রতিফলন ঘটায়, তবুও, আমি চেষ্টা করে দেখাব যে স্কালা সাধারণত অন্যান্য স্বীকৃত ভাষাগুলির চেয়ে অনেক কাছাকাছি is
পরিভাষা সত্ত্বেও, নির্ভরশীল যোগফলগুলি (সিগমা প্রকার হিসাবেও পরিচিত) কেবলমাত্র মানগুলির একটি জোড়া যেখানে দ্বিতীয় মানের ধরণটি প্রথম মানের উপর নির্ভরশীল। এটি স্কালায় সরাসরি উপস্থাপনযোগ্য,
scala> trait Sigma {
| val foo: Foo
| val bar: foo.Bar
| }
defined trait Sigma
scala> val sigma = new Sigma {
| val foo = foo1
| val bar = new foo.Bar
| }
sigma: java.lang.Object with Sigma{val bar: this.foo.Bar} = $anon$1@e3fabd8
এবং প্রকৃতপক্ষে, এটি নির্ভরশীল পদ্ধতি ধরণের এনকোডিংয়ের একটি গুরুত্বপূর্ণ অংশ যা স্কেলার 'ডুমারী অব ডুম' থেকে ২.১০ (বা পরীক্ষামূলক-নির্ভরশীল-পদ্ধতির ধরণের স্কেল সংকলক বিকল্পের মাধ্যমে) থেকে পালাতে হবে।
নির্ভরশীল পণ্যের ধরণ (ওরফে পাই প্রকারগুলি) মানগুলি থেকে শুরু করে ধরণের হয়ে থাকে functions নির্ভরযোগ্যভাবে টাইপ করা প্রোগ্রামিং ভাষার জন্য তারা স্ট্যাটিকালি মাপের ভেক্টর এবং অন্যান্য পোস্টার শিশুদের উপস্থাপনের মূল বিষয় । আমরা পাথ নির্ভরশীল প্রকারগুলি, সিঙ্গেলটন ধরণের এবং অন্তর্নিহিত পরামিতির সংমিশ্রণ ব্যবহার করে স্কালায় পাই প্রকারগুলি এনকোড করতে পারি। প্রথমে আমরা একটি বৈশিষ্ট্যটি সংজ্ঞায়িত করি যা টি টাইপ টির মান থেকে একটি টাইপ ইউ তে কোনও ফাংশনকে উপস্থাপন করতে চলেছে,
scala> trait Pi[T] { type U }
defined trait Pi
আমরা একটি পলিমারফিক পদ্ধতির চেয়ে সংজ্ঞা দিতে পারি যা এই ধরণের ব্যবহার করে,
scala> def depList[T](t: T)(implicit pi: Pi[T]): List[pi.U] = Nil
depList: [T](t: T)(implicit pi: Pi[T])List[pi.U]
( pi.U
ফলাফলের ধরণে নির্ভরশীল ধরণের ব্যবহারটি লক্ষ্য করুন List[pi.U]
)। টাইপ টির মান দেওয়া, এই ফাংশনটি নির্দিষ্ট টি মানের সাথে সম্পর্কিত ধরণের মানগুলির একটি (n খালি) তালিকা ফেরত দেবে।
আসুন আমরা যে কার্যকরী সম্পর্কগুলি ধরে রাখতে চাই তার জন্য কিছু উপযুক্ত মান এবং অন্তর্নিহিত সাক্ষী সংজ্ঞায়িত করি,
scala> object Foo
defined module Foo
scala> object Bar
defined module Bar
scala> implicit val fooInt = new Pi[Foo.type] { type U = Int }
fooInt: java.lang.Object with Pi[Foo.type]{type U = Int} = $anon$1@60681a11
scala> implicit val barString = new Pi[Bar.type] { type U = String }
barString: java.lang.Object with Pi[Bar.type]{type U = String} = $anon$1@187602ae
এবং এখন এখানে রয়েছে আমাদের পাই-টাইপ-ব্যবহার করে ফাংশন,
scala> depList(Foo)
res2: List[fooInt.U] = List()
scala> depList(Bar)
res3: List[barString.U] = List()
scala> implicitly[res2.type <:< List[Int]]
res4: <:<[res2.type,List[Int]] = <function1>
scala> implicitly[res2.type <:< List[String]]
<console>:19: error: Cannot prove that res2.type <:< List[String].
implicitly[res2.type <:< List[String]]
^
scala> implicitly[res3.type <:< List[String]]
res6: <:<[res3.type,List[String]] = <function1>
scala> implicitly[res3.type <:< List[Int]]
<console>:19: error: Cannot prove that res3.type <:< List[Int].
implicitly[res3.type <:< List[Int]]
(নোট যে আমরা এখানে Scala এর ব্যবহার <:<
বদলে উপপ্রকার-প্রত্যক্ষীকরণ অপারেটর =:=
কারণ res2.type
এবং res3.type
Singleton ধরনের ও বিভিন্ন ধরণের আমরা RHS উপর যাচাই করছেন চেয়ে অত: পর আরও ভালো হয়)।
বাস্তবে, তবে স্কেলে আমরা সিগমা এবং পাই টাইপগুলি এনকোড করে এবং সেখান থেকে আগা বা ইদ্রিসের মতো অগ্রসর হব না। পরিবর্তে আমরা পাথ-নির্ভর ধরণ, একক প্রকার এবং সরাসরি জড়িত ব্যবহার করব। এটি কীভাবে আকারহীন হয়ে যায় তার বিভিন্ন উদাহরণ পেতে পারেন: মাপের ধরণের ধরন , এক্সটেনসিবল রেকর্ডস , বিস্তৃত এইচ লিস্টস , আপনার বয়লারপ্লেট স্ক্র্যাপ করুন , জেনেরিক জিপারস ইত্যাদি etc.
কেবলমাত্র আপত্তিটি আমি দেখতে পাচ্ছি যে পাই প্রকারের উপরের এনকোডিংয়ের জন্য আমাদের নির্ভরশীল অন মানগুলির একক প্রকারের প্রয়োজন প্রকাশযোগ্য। দুর্ভাগ্যক্রমে স্কালায় এটি কেবলমাত্র রেফারেন্স ধরণের মানের জন্যই সম্ভব এবং অ-রেফারেন্স টাইপের মানগুলির জন্য নয় (উদাহরণস্বরূপ ইনট)) এই লজ্জা, কিন্তু না একটি স্বকীয় অসুবিধা হল: Scala ধরন পরীক্ষক অভ্যন্তরীণভাবে অ রেফারেন্স মান Singleton ধরনের প্রতিনিধিত্ব করে, এবং একটি সেখানে ছিলাম দম্পতি এর পরীক্ষায় সরাসরি তাদের ব্যক্ত করা যায় এমন তৈরীর। অনুশীলনে আমরা প্রাকৃতিক সংখ্যার মোটামুটি স্ট্যান্ডার্ড টাইপ-লেভেল এনকোডিং দিয়ে সমস্যাটি নিয়ে কাজ করতে পারি ।
যাই হোক না কেন, আমি মনে করি না যে এই সামান্য ডোমেন বিধিনিষেধ নির্ভরশীলভাবে টাইপ করা ভাষা হিসাবে স্কালার স্ট্যাটাসের আপত্তি হিসাবে ব্যবহার করা যেতে পারে। যদি তা হয় তবে নির্ভরশীল এমএল (যা কেবলমাত্র প্রাকৃতিক সংখ্যার উপর নির্ভরশীলতার অনুমতি দেয়) এর ক্ষেত্রে এটি উদ্ভট উপসংহারে পরিণত হতে পারে said