let
-Eğerleri uygulamalara çevirebileceğimiz yaygın bir yanlış anlamadır . Arasındaki fark let x : t := b in v
ve (fun x : t => v) b
içinde olmasıdır let
arasında -Anlatım sırasında tip denetimi v
bunu biliyoruz x
eşittir b
, ama uygulamada biz (alt ifade yok fun x : t => v
kendi 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ü a
yazı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ı .
let
ifadelere ihtiyaç duymamak için bir saldırı eklemek gibi geliyor , ancak a) ifadelerden kaçınmak için bir neden yoklet
ve bunlar da kullanışlı ve b) ana dilinize kesmek eklemek harika bir fikir değil.