এটি একটি সাধারণ ভুল ধারণা যা আমরা let
অ্যাপ্লিকেশনগুলিতে এক্সপ্রেসশনগুলি অনুবাদ করতে পারি । মধ্যে পার্থক্য let x : t := b in v
এবং (fun x : t => v) b
যে হয় let
এর -expression সময় টাইপ-পরীক্ষণের v
আমরা জানি যে x
সমান b
, কিন্তু আবেদন আমরা করবেন না (subexpression 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
টাইপ করা যায় না, তবে আমরা যদি এর সংজ্ঞাটি প্রকাশ করি তবে আমরা একটি ভাল-টাইপযুক্ত অভিব্যক্তি পাই। আপনি কি মনে করেন ব্যবহারকারীরা আমাদের ভালবাসেন, বা আমাদের নকশার সিদ্ধান্তের জন্য আমাদের ঘৃণা করবেন?
"বিশেষ কেস" হওয়ার অর্থ কী তা আপনার মনোযোগ সহকারে চিন্তা করতে হবে। আমার যদি কোনও অ্যাপ্লিকেশন থাকে তবে আমি decide অবস্ট্রাকশন কিনা তা সিদ্ধান্ত নেওয়ার আগে আমার কি e₁ e₂
স্বাভাবিক হওয়া উচিত ? যদি হ্যাঁ, এর অর্থ আমি খারাপ-টাইপযুক্ত ভাবগুলি স্বাভাবিক করব এবং সেগুলি চক্র হতে পারে। যদি না হয়, আপনার প্রস্তাবের ব্যবহারযোগ্যতা সন্দেহজনক বলে মনে হচ্ছে।e₁
λ
আপনি মৌলিক উপপাদ্যটিও ভেঙে ফেলবেন যা বলে যে একটি ভাল-টাইপযুক্ত এক্সপ্রেশনটির প্রতিটি উপ-এক্সপ্রেশনটি ভাল-টাইপযুক্ত। এটি null
জাভা প্রবর্তনের মত বোধগম্য ।
let
প্রকাশের প্রয়োজন এড়াতে একটি হ্যাক যুক্ত করার মতো মনে হচ্ছে , তবে এর একটি)let
ভাব প্রকাশ এড়ানোর কোনও কারণ নেই এবং সেগুলি সুবিধাজনকও রয়েছে, এবং খ) আপনার মূল ভাষায় হ্যাক যুক্ত করা কোনও দুর্দান্ত ধারণা নয়।