কোনও কারণের জন্য স্কেলা সুস্পষ্টভাবে নির্ভরশীল প্রকারগুলি সমর্থন করে না?


109

পাথ নির্ভরশীল প্রকারগুলি রয়েছে এবং আমি মনে করি স্কালায় এপিগ্রাম বা আগদার মতো ভাষার প্রায় সমস্ত বৈশিষ্ট্য প্রকাশ করা সম্ভব হয়েছে, তবে আমি ভাবছি কেন স্কালা এটিকে আরও স্পষ্টভাবে সমর্থন করে না যেমন এটি অন্যান্য অঞ্চলে খুব সুন্দর করে তোলে (বলুন) , ডিএসএল)? আমি যে কিছু মিস করছি "এটি প্রয়োজনীয় নয়"?


3
হ্যাঁ, স্কালার ডিজাইনাররা বিশ্বাস করেন যে বারেনড্রেগ্ট ল্যাম্বদা কিউব টাইপ থিওরির সর্ব-শেষ-নয়। এটি কারণ হতে পারে বা নাও হতে পারে।
জার্গ ডব্লু মিট্টাগ

8
@ JörgWMittag লামদা কিউব কি? একরকম ম্যাজিক ডিভাইস?
আশকান খ। নাজরী

@ ashy_32bit এখানে বারেনড্রেগেটের কাগজটি "জেনারালাইজড টাইপ সিস্টেমগুলির পরিচিতি" দেখুন: diku.dk/hjemmesider/ansatte/henglein/papers/barendregt1991.pdf
iainmcgin

উত্তর:


151

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

নির্ভরশীল ধরণের জন্য স্কালার অন্তর্নিহিত সমর্থন পথ-নির্ভর ধরণের মাধ্যমে । এগুলি কোনও ধরণের নির্বাচিত পাথের উপর নির্ভর করে কোনও বস্তুর মাধ্যমে (যেমন: মান-) গ্রাফের মাধ্যমে,

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.typeSingleton ধরনের ও বিভিন্ন ধরণের আমরা RHS উপর যাচাই করছেন চেয়ে অত: পর আরও ভালো হয়)।

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

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

যাই হোক না কেন, আমি মনে করি না যে এই সামান্য ডোমেন বিধিনিষেধ নির্ভরশীলভাবে টাইপ করা ভাষা হিসাবে স্কালার স্ট্যাটাসের আপত্তি হিসাবে ব্যবহার করা যেতে পারে। যদি তা হয় তবে নির্ভরশীল এমএল (যা কেবলমাত্র প্রাকৃতিক সংখ্যার উপর নির্ভরশীলতার অনুমতি দেয়) এর ক্ষেত্রে এটি উদ্ভট উপসংহারে পরিণত হতে পারে said


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

8
আমি হ্রাস পেয়েছি কারণ ম্যাকব্রাইডের "ফেকিং ইট" citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.2636 - তে বর্ণিত কৌশলগুলি থেকে আমি এখানে কৌশলগুলিকে সংক্ষেপে আলাদা করতে পারি না - অর্থাৎ এগুলি অনুকরণ করার উপায়গুলি নির্ভরশীল প্রকার, সরাসরি তাদের সরবরাহ না।
sclv

2
@sclv আমি মনে করি আপনি মিস করেছেন যে স্কালার কোনও প্রকারের এনকোডিং ছাড়াই নির্ভরশীল প্রকারগুলি রয়েছে: উপরের প্রথম উদাহরণটি দেখুন। আপনি একদম ঠিক বলেছেন যে পাই পাইগুলির আমার এনকোডিংটি কনরারের কাগজের মতো একই কৌশল ব্যবহার করেছে তবে ইতিমধ্যে পথ-নির্ভর ধরণের এবং সিঙ্গলটন প্রকার অন্তর্ভুক্ত এমন একটি স্তর থেকে।
মাইলস সাবিন

4
নাঃ। নিশ্চয়ই আপনার কাছে বস্তুর সাথে টাইপগুলি থাকতে পারে (এটি মডিউল হিসাবে বস্তুর পরিণতি)। তবে মান-স্তরের সাক্ষী ব্যবহার না করে আপনি এই ধরণের বিষয়ে গণনা করতে পারবেন না। আসলে =: = নিজেই এক মূল্য স্তরের সাক্ষী! আপনি এখনও এটি নকল করছেন, যেমন আপনার যেমন হাস্কেলকে করতে হবে বা সম্ভবত আরও কিছু।
sclv

9
স্কালার =: = মান-স্তর নয়, এটি একটি ধরণের নির্মাতা - এর মান এখানে রয়েছে: github.com/scala/scala/blob/v2.10.3/src/library/scala/… , এবং মনে হয় না আগদা এবং ইদ্রিসের মতো নির্ভরশীল-টাইপযুক্ত ভাষাগুলিতে সমতার প্রস্তাবের জন্য সাক্ষীর চেয়ে আলাদা: ( Www2.tcs.ifi.lmu.de/~abel/Equality.pdf বিভাগ 2, এবং eb.host.cs.st-andrews.ac.uk/writings/idris-tutorial.pdf বিভাগ 8.1, যথাক্রমে দেখুন।)
pdxleif

6

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


নির্ভরশীল ধরণের (সম্ভবত একটি লিঙ্ক) কিছু তাত্ত্বিক পটভূমি দেওয়ার জন্য আপনি কি যথেষ্ট দয়াবান হবেন?
আশকান খ। নাজরি

3
@ ashy_32 বিট যদি আপনি বেঞ্জামিন পিয়ার্সের "প্রকার এবং প্রোগ্রামিং ভাষায় উন্নত বিষয়সমূহ" এ অ্যাক্সেস পেতে পারেন তবে সেখানে একটি অধ্যায় রয়েছে যা নির্ভরশীল ধরণের যুক্তিসঙ্গত পরিচয় দেয়। আপনি কনর ম্যাকব্রাইডের কিছু কাগজপত্রও পড়তে পারেন যার তত্ত্বের পরিবর্তে অনুশীলনের ক্ষেত্রে নির্ভরশীল ধরণের মধ্যে বিশেষ আগ্রহ রয়েছে।
iainmcgin

3

আমি বিশ্বাস করি যে স্কালার পাথ নির্ভরশীল প্রকারগুলি কেবল Σ-প্রকারের প্রতিনিধিত্ব করতে পারে তবে Π-প্রকার নয়। এই:

trait Pi[T] { type U }

হুবহু এক ধরণের নয়। সংজ্ঞা অনুসারে, Π-টাইপ, বা নির্ভরশীল পণ্য, এমন একটি ফাংশন যা ফলাফল প্রকারটি আর্গুমেন্ট মানের উপর নির্ভর করে, সার্বজনীন কোয়ান্টিফায়ারকে প্রতিনিধিত্ব করে, ∀x: A, B (x)। উপরের ক্ষেত্রে, তবে এটি কেবল টাইপ টির উপর নির্ভর করে তবে এই ধরণের কোনও মানের উপর নির্ভর করে না। পাই বৈশিষ্ট্য নিজেই একটি type-ধরণের, একটি অস্তিত্বযুক্ত কোয়ান্টিফায়ার, অর্থাৎ :x: এ, বি (এক্স)। এই ক্ষেত্রে অবজেক্টের স্ব-রেফারেন্স পরিমাণযুক্ত ভেরিয়েবল হিসাবে কাজ করছে। অন্তর্নিহিত প্যারামিটার হিসাবে পাস করার পরে, তবে এটি কোনও সাধারণ ধরণের ফাংশন হ্রাস করে, কারণ এটি টাইপ-ভিত্তিতে সমাধান করা হয়। স্কালায় নির্ভরশীল পণ্যের জন্য এনকোডিং নিম্নলিখিতগুলির মতো দেখতে পারে:

trait Sigma[T] {
  val x: T
  type U //can depend on x
}

// (t: T) => (∃ mapping(x, U), x == t) => (u: U); sadly, refinement won't compile
def pi[T](t: T)(implicit mapping: Sigma[T] { val x = t }): mapping.U 

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

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


1
মাইলস সাবিন উপরোক্ত Piমানের উপর নির্ভর করে প্রকার তৈরি করতে ব্যবহার করার উদাহরণ দেখিয়েছে ।
মিসিংফ্যাক্টর

উদাহরণস্বরূপ, থেকে depListসূত্রগুলি টাইপ Uকরে Pi[T], এর প্রকারের জন্য নির্বাচিত (মান নয়) t। এই ধরণেরটি কেবল সিঙ্গেলটন প্রকার হিসাবে ঘটে যা বর্তমানে স্কেলা সিঙ্গলটন অবজেক্টে উপলব্ধ এবং তাদের সঠিক মানগুলি উপস্থাপন করে। উদাহরণ Piপ্রতি সিঙ্গলটন অবজেক্ট টাইপের একটি বাস্তবায়ন তৈরি করে , সুতরাং টাইপের সাথে মানের সাথে টাইপ করে টাইপ করে। Π-টাইপ, অন্যদিকে, এমন একটি সূত্র যা এর ইনপুট প্যারামিটারের কাঠামোর সাথে মেলে। সম্ভবত, স্কালায় সেগুলি নেই কারণ types-প্রকারের জন্য প্রতিটি পরামিতি প্রকারের GADT হওয়া আবশ্যক এবং স্কালা GADT গুলি অন্যান্য ধরণের থেকে আলাদা করে না।
পি। ফ্রোলভ

ঠিক আছে, আমি কিছুটা বিভ্রান্ত pi.Uমাইলসের উদাহরণে নির্ভরশীল ধরণ হিসাবে গণনা করা হবে না ? এটা মান pi
মিসিংফ্যাক্টর

2
এটি প্রকৃতপক্ষে নির্ভরশীল ধরণের হিসাবে গণনা করা হয় তবে সেগুলির বিভিন্ন স্বাদ রয়েছে: Σ-টাইপ ("সেখানে এমন একটি এক্স রয়েছে যেমন পি (এক্স)", যুক্তি অনুসারে) এবং Π-টাইপ ("সমস্ত এক্স, পি (এক্স)") । যেমনটি আপনি উল্লেখ করেছেন, প্রকারের pi.Uমান নির্ভর করে pi। সমস্যা প্রতিরোধ করে trait Pi[T]একটি Π-টাইপ হওয়া থেকে আমরা এটা একটি অবাধ যুক্তি মান উপর নির্ভরশীল (উদাহরণস্বরূপ, আপনি করতে পারবেন না হয় tdepListধরনের পর্যায়ে যে যুক্তি তুলে ছাড়াই)।
পি। ফ্রোলভ 18

1

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

স্কালাকে ইদ্রিসের মতো কিছুতে পরিণত করা (আমি খুব শক্তভাবে কল্পনা করি) বা ইড্রিসের পক্ষে সামর্থ্যের মতো আরও সরাসরি সহায়তা দেওয়ার মতো একটি লাইব্রেরি লিখতে (যেমন singletonsহাস্কেলের সাথে থাকার চেষ্টা করা ) কতটা সহজ হবে এই প্রশ্নের উত্তর দেওয়ার চেষ্টা নয়।

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

স্কালা (হাস্কেলের অনুরূপ) প্রচুর পরিমাণের স্তর গণনাগুলিকে এনকোড করতে সক্ষম হতে পারে। এটি লাইব্রেরি দ্বারা দেখানো হয় shapeless। এই লাইব্রেরিগুলি কিছু সত্যই চিত্তাকর্ষক এবং চতুর কৌশল ব্যবহার করে এটি করে। তবে, তাদের ধরণের স্তরের কোডটি (বর্তমানে) মান স্তরের প্রকাশের থেকে একেবারেই আলাদা (আমি দেখতে পাচ্ছি যে ফাঁকটি হাস্কেলের সাথে কিছুটা কাছাকাছি রয়েছে)। ইদ্রিস এএস আইএস টাইপের স্তরে মান স্তরের প্রকাশটি ব্যবহার করতে দেয়।

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

যাচাই কোড বিবেচনা করুন। দেখুন:
https://github.com/idris-lang/Idris-dev/blob/v1.3.0/libs/contrib/Interfaces/
যাচাইকৃত.আইডিআর টাইপ চেকার monadic / ফান্টেক্টর / প্রয়োগকারী আইনের প্রমাণ যাচাই করে এবং প্রমাণগুলি প্রকৃত সম্পর্কে মোনাড / ফান্টেক্টর / প্রয়োগকারী এবং কিছু এনকোডযুক্ত ধরণের সমতুল্য নয় যা একই বা একই নয় not বড় প্রশ্ন আমরা প্রমাণ করছি কি?

চতুর এনকোডিং ট্রিকগুলি ব্যবহার করে আমিও একই কাজ করতে পারি (হাস্কেল সংস্করণের জন্য নিম্নলিখিতগুলি দেখুন, আমি স্কালার জন্য একটিও দেখিনি)
https://blog.jle.im/entry/verified-inferences-in-haskell.html
https: // github.com/rpeszek/IdrisTddNotes/wiki/Play_FunctorLaws প্রকারগুলি
বাদ দিয়ে এত জটিল যে আইনগুলি দেখতে পাওয়া শক্ত, মান স্তরের প্রকাশগুলি রূপান্তরিত হয় (স্বয়ংক্রিয়ভাবে তবে এখনও) স্তরগুলি টাইপ করতে এবং আপনাকে সেই রূপান্তরকেও বিশ্বাস করতে হবে । এই সমস্ত ক্ষেত্রে ত্রুটি থাকার জায়গা রয়েছে যা প্র্যান্ডা সহকারী হিসাবে অভিনয়ের সংকলনের উদ্দেশ্যকে অস্বীকার করে a

(2018.8.10 সম্পাদিত) প্রুফ সহায়তা সম্পর্কে কথা বলা, এখানে ইদ্রিস এবং স্কালার মধ্যে আরও একটি বড় পার্থক্য। স্কালায় (বা হাস্কেল) তেমন কিছুই নেই যা ডাইভার্জিং প্রুফগুলি রোধ করতে বাধা দিতে পারে:

case class Void(underlying: Nothing) extends AnyVal //should be uninhabited
def impossible() : Void = impossible()

যখন ইদ্রিসের totalএই কোডটি সংকলন থেকে বাঁচানোর কোড রয়েছে।

একটি স্কালা লাইব্রেরি যা মান এবং টাইপ লেভেল কোডকে (হাস্কেলের মতো singletons) একত্রিত করার চেষ্টা করে স্কালার নির্ভরশীল ধরণের সমর্থনের জন্য একটি আকর্ষণীয় পরীক্ষা হবে। পাথ-নির্ভর ধরণের কারণে স্ক্যালায় এ জাতীয় গ্রন্থাগার কি আরও ভাল করা যায়?

আমি নিজেই এই প্রশ্নের উত্তর দেওয়ার জন্য স্কালায় খুব নতুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.