15312 Foundations Of Programming Languages _verified_ -
Once you understand the "foundations," you stop seeing languages like Python, Rust, or Haskell as collections of syntax. Instead, you see them as combinations of specific features (e.g., "This is just Hindley-Milner type inference with affine logic"). Verification Skills:
In 15312, concurrency is studied through like CSP (Communicating Sequential Processes) and π-calculus. These formalisms treat programs as interacting processes, allowing algebraic reasoning about communication and synchronization.
A student who finishes 15312 sees code differently. A loop is not just a loop—it’s a fixed point. A variable is not just a name—it’s a reference cell in a store. A function call is not just a jump—it’s a β-reduction in lambda calculus. 15312 foundations of programming languages
A rule has premises above the line and conclusion below: [ \fracJ_1 \quad J_2 \quad \dots \quad J_nJ ]
-- Infer.hs inferType :: Expr -> TypeScheme inferType (Lam x e) = Forall x (inferType e) inferType (App e1 e2) = case inferType e1 of Mono (Fun t1 t2) -> Mono t2 Forall x t -> inferType (subst x t2 t) where subst x t (TV y) | x == y = t subst x t (TCon c ts) = TCon c (map (subst x t) ts) Once you understand the "foundations," you stop seeing
The course maps out exactly how an expression transitions to the next state (
Students learn to write deductive rules (using horizontal inference bars) to define: A variable is not just a name—it’s a
), the meaning of the function does not change. This is called (alpha-equivalence).
But types do more than prevent errors. They express intent . A function add : int × int → int says clearly: “I take two integers and return an integer.”