system-f

star 15

Implement System F (polymorphic lambda calculus) with type abstraction and application.

rainoftime By rainoftime schedule Updated 2/19/2026

name: system-f description: "Implement System F (polymorphic lambda calculus) with type abstraction and application." version: "1.0.0" tags: [type-theory, polymorphism, lambda-calculus, popl] difficulty: advanced languages: [haskell, ocaml, python] dependencies: [simply-typed-lambda-calculus, type-inference-engine]

System F (Polymorphic Lambda Calculus)

System F, also known as the polymorphic lambda calculus or Girard-Reynolds calculus, extends the simply-typed lambda calculus with type abstraction and type application, enabling universal quantification over types.

When to Use This Skill

  • Implementing polymorphic type systems
  • Building generic programming constructs
  • Researching type theory foundations
  • Implementing ML-style module systems
  • Understanding parametric polymorphism

What This Skill Does

  1. Type Abstraction (Λ): Bind type variables in terms, written as Λα. t
  2. Type Application: Instantiate polymorphic terms with concrete types, written as t [T]
  3. Universal Types: Express types like ∀α. τ for polymorphic values
  4. Kind System: Handle type-level computation and classification
  5. Type Safety: Prove progress and preservation theorems

Key Concepts

Concept Description
Type Abstraction Λα.t binds type variable α in term t
Type Application t [T] instantiates polymorphic term with type T
Universal Quantification ∀α.τ represents polymorphic types
Parametricity Polymorphic functions behave uniformly across types
Predicativity Type variables range only over "small" types

Tips

  • Use De Bruijn indices for type variables to avoid capture
  • Implement type substitution carefully to avoid variable capture
  • Consider adding kind checking for higher-rank types
  • Test with Church encodings to verify polymorphism
  • Use bidirectional type checking for better error messages

Common Use Cases

  • Implementing generic data structures (lists, trees, maps)
  • Building type-safe container libraries
  • Researching type inference algorithms
  • Understanding ML-style let-polymorphism
  • Formalizing parametricity theorems

Related Skills

  • simply-typed-lambda-calculus - Foundation before System F
  • type-inference-engine - Algorithm W for Hindley-Milner
  • type-class-implementer - Type classes as alternative to System F
  • existential-types - Dual to universal types

Canonical References

Reference Why It Matters
Girard, Lafont, Taylor, "Proofs and Types" (1989) Original System F presentation
Pierce, "Types and Programming Languages" Ch. 23-24 Modern textbook treatment
Reynolds, "Types, Abstraction and Parametric Polymorphism" (1983) Parametricity theorem
Wadler, "Theorems for Free!" (FPCA 1989) Practical parametricity results

Tradeoffs and Limitations

Approach Tradeoffs

Approach Pros Cons
Explicit type abstraction Simple, predictable Verbose syntax
Type inference (HM) Concise code Less expressive than full System F
Bidirectional checking Good error messages Requires annotations at boundaries

When NOT to Use This Skill

  • When Hindley-Milner type inference suffices (use type-inference-engine)
  • For simple monomorphic programs (use simply-typed-lambda-calculus)
  • When performance is critical (type erasure complicates optimization)

Limitations

  • Type reconstruction is undecidable for full System F
  • Rank-N types require explicit annotations
  • No built-in recursion (must add fixpoint combinator)

Assessment Criteria

A high-quality implementation should have:

Criterion What to Look For
Type Safety Proven progress and preservation
Substitution Capture-avoiding type substitution
Error Messages Clear indication of type mismatches
Parametricity Polymorphic functions behave uniformly

Quality Indicators

Good: Implements full System F with type abstraction/application, proven type safety ⚠️ Warning: Only handles rank-1 types, missing explicit type application ❌ Bad: No type abstraction, just simply-typed lambda calculus

Research Tools & Artifacts

System F implementations:

Tool What to Learn
GHC Core System F in practice
Twelf Logical framework

Research Frontiers

1. Higher-Rank Types

  • Challenge: Type inference for rank-N polymorphism
  • Approach: Bidirectional type checking with annotations
  • Papers: Peyton Jones et al. "Practical type inference for arbitrary-rank types" (ICFP 2004)

2. Kind Systems

  • Challenge: Higher-kinded polymorphism
  • Approach: Kind inference and checking
  • Papers: "System Fω" (Girard)

Implementation Pitfalls

Pitfall Real Consequence Solution
Type inference undecidable Non-termination Use bidirectional checking
Variable capture Wrong types De Bruijn indices
Missing type application Runtime errors Explicit instantiation
Install via CLI
npx skills add https://github.com/rainoftime/pl-skills --skill system-f
Repository Details
star Stars 15
call_split Forks 2
navigation Branch main
article Path SKILL.md
More from Creator