क्यों कोक अपनी मूल भाषा में लेट-एक्सप्रेशंस को शामिल करता है


9

Coq में इसकी मुख्य भाषा में लेट-एक्सप्रेशन शामिल हैं। हम इस तरह के अनुप्रयोगों के लिए लेट-एक्सप्रेशन का अनुवाद कर सकते हैं: let x : t = v in b ~> (\(x:t). b) v मैं समझता हूं कि यह हमेशा काम नहीं करता है क्योंकि vटाइपकास्ट करने पर मूल्य उपलब्ध नहीं होगा b। हालाँकि, यह विशेष रूप से फॉर्म के अनुप्रयोगों के टाइपकास्टिंग के द्वारा आसानी से तय किया जा सकता है (\(x:t). b) v। यह हमें टाइप-चेक करते समय एक विशेष मामले की कीमत पर लेट-एक्सप्रेशंस को हटाने की अनुमति देता है। क्यों कोक में अभी भी लेट-एक्सप्रेशंस शामिल हैं? क्या उनके पास अन्य फायदे हैं (विशेष मामले की आवश्यकता नहीं है)?


4
आपका सुझाव लगता है कि ज़रूरत के letभावों से बचने के लिए हैक जोड़ना , लेकिन ए) letअभिव्यक्ति से बचने का कोई कारण नहीं है और वे सुविधाजनक भी हैं, और b) आपकी मूल भाषा में हैक जोड़ना कोई बहुत अच्छा विचार नहीं है।
डेरेक एल्किंस ने 19

जवाबों:


23

यह एक आम गलत धारणा है कि हम letअनुप्रयोगों के लिए -expresions का अनुवाद कर सकते हैं । के बीच का अंतर let x : t := b in vऔर (fun x : t => v) bहै कि में है letकी -expression, दौरान प्रकार की जाँच vहम जानते हैं कि xके बराबर है b, लेकिन आवेदन में हम नहीं (उपसूचक fun x : t => vअपने आप ही समझ बनाने के लिए है)।

यहाँ एक उदाहरण है:

(* Dependent type of vectors. *)
Inductive Vector {A : Type} : nat -> Type :=
  | nil : Vector 0
  | cons : forall n, A -> Vector n -> Vector (S n).

(* This works. *)
Check (let n := 0 in cons n 42 nil).

(* This fails. *)
Check ((fun (n : nat) => cons n 42 nil) 0).

आवेदन को (fun x : t => v) bएक विशेष मामला बनाने के लिए आपका सुझाव वास्तव में काम नहीं करता है। आइए हम इसके बारे में अधिक सावधानी से विचार करें।

उदाहरण के लिए, उपरोक्त उदाहरण को जारी रखते हुए आप इससे कैसे निपटेंगे?

Definition a := (fun (n : nat) => cons n 42 nil).
Check a 0.

संभवतः यह काम नहीं करेगा क्योंकि aटाइप नहीं किया जा सकता है, लेकिन यदि हम इसकी परिभाषा को प्रकट करते हैं, तो हमें एक अच्छी तरह से टाइप की गई अभिव्यक्ति मिलती है। क्या आपको लगता है कि उपयोगकर्ता हमसे प्यार करेंगे, या हमारे डिजाइन निर्णय के लिए हमसे नफरत करेंगे?

आपको ध्यान से सोचने की ज़रूरत है कि "विशेष मामले" का क्या मतलब है। अगर मेरे पास कोई एप्लिकेशन है e₁ e₂, तो क्या मुझे e₁यह तय करने से पहले सामान्य करना चाहिए कि क्या यह एक हैλ-abstraction? यदि हां, तो इसका मतलब है कि मैं बीमार टाइप के भावों को सामान्य करूंगा, और वे साइकिल चला सकते हैं। यदि नहीं, तो आपके प्रस्ताव की उपयोगिता संदिग्ध लगती है।

आप उस मौलिक प्रमेय को भी तोड़ देंगे जो कहता है कि अच्छी तरह से टाइप की गई हर अभिव्यक्ति अच्छी तरह से टाइप की जाती है। कि nullजावा में शुरू करने के रूप में समझदार है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.