let-Eğerleri uygulamalara çevirebileceğimiz yaygın bir yanlış anlamadır . Arasındaki fark let x : t := b in vve (fun x : t => v) biçinde olmasıdır letarasında -Anlatım sırasında tip denetimi vbunu biliyoruz xeşittir b, ama uygulamada biz (alt ifade yok fun x : t => vkendi başına mantıklı olmalı).
İşte bir örnek:
(* 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).
Uygulamayı (fun x : t => v) bözel bir durum haline getirme öneriniz gerçekten işe yaramıyor. Daha dikkatli düşünelim.
Örneğin, yukarıdaki örneğe devam ederek bununla nasıl başa çıkacaksınız?
Definition a := (fun (n : nat) => cons n 42 nil).
Check a 0.
Muhtemelen bu işe yaramayacaktır çünkü ayazılamaz, ancak tanımını açarsak iyi yazılmış bir ifade alırız. Kullanıcıların tasarım kararımız için bizi seveceğini veya nefret edeceğini düşünüyor musunuz?
"Özel durum" a sahip olmanın ne anlama geldiğini dikkatlice düşünmelisiniz. Bir başvurum varsa, başvurunun geçerli olup olmadığına karar vermeden önce e₁ e₂normalleştirmem gerekir e₁mi?λ-soyutlama? Evet ise, bu, kötü yazılmış ifadeleri normalleştireceğim anlamına gelir ve bunlar döngü yapabilir. Hayır ise, teklifinizin kullanılabilirliği şüpheli görünüyor.
Ayrıca, iyi yazılmış bir ifadenin her alt ifadesinin iyi yazıldığını söyleyen temel teoremi de kırarsınız. Bu null, Java'yı tanıtmak kadar mantıklı .
letifadelere ihtiyaç duymamak için bir saldırı eklemek gibi geliyor , ancak a) ifadelerden kaçınmak için bir neden yokletve bunlar da kullanışlı ve b) ana dilinize kesmek eklemek harika bir fikir değil.