1 The concept of dependent types
- Dependent Types in Programming abstract in APPSEM'2000
- Do we need dependent types? by Daniel Fridlender and Mia Indrika, 2001.
1.2 Type theory
Simon Thompson: Type Theory and Functional Programming. Section 6.3 deals with dependent types, but because of the strong emphasis on Curry-Howard isomorphism and the connections between logic and programming, the book seemed cathartic for me even from its beginning.
Another interesting approach to Curry-Howard isomorphism and the concept of dependent type: Lecture 9. Semantics and pragmatics of text and dialogue dicsusses these concepts in the context of linguistics. Written by Arne Ranta, see also his online course and other linguistical materials on the Linguistics wikipage.
1.3 Illative combinatory logic
To see how Illative Combinatory logic deals with dependent types, see combinator G described in Systems of Illative Combinatory Logic complete for first-order propositional and predicate calculus by Henk Barendregt, Martin Bunder, Wil Dekkers. It seems to me that the dependent type construct of Epigram corresponds to in Illative Combinatory Logic. I think e.g. the followings should correspond to each other:
2 Dependently typed languages
Epigram is a full dependently typed programming language, see especially
- Epigram Tutorial by Conor McBride
- and Why dependent types matter by Thorsten Altenkirch, Conor McBride and James McKinna).
Dependent types (of this language) also provide a not-forgetful concept of views (already mentioned in the Haskell Future of Haskell#Extensions of Haskell; the connection between these concepts is described in p. 32 of Epigram Tutorial (section 4.6 Patterns Forget; Matching Is Remembering).
See Epigram also as theorem prover.
Agda is a system for incrementally developing proofs and programs. Agda is also a functional language with dependent types. This language is similar to Epigram but has a more Haskell-like syntax.
People who are interested also in theorem proving may see the theorem provers page.
Idris is a general purpose pure functional programming language with dependent types, eager evaluation, and optional lazy evaluation via laziness annotations. It has a very Haskell-like syntax and is available on Hackage.
Dependent types make it possible not to have a separate module language and a core language. This idea may concern Haskell too, see First-class module page.
Dependent types make it useful also as a theorem prover.
3 Dependent types in Haskell programming
3.1 Lightweight Dependent Typing
This web page describes the lightweight approach and its applications, e.g., statically safe head/tail functions and the elimination of array bound check (even in such complex algorithms as Knuth-Morris-Pratt string search). The page also briefly describes `singleton types' (Hayashi and Xi).
Dependent Types in Haskell (some ideas) (404).
3.4 Simulating them
- Faking it: Simulating Dependent Types in Haskell, by Conor McBride
SimulatingDependentTypes of HaWiki(404 Error)
- The See also section of Type page contains links to many related idioms. Especially type arithmetic seems to me also a way yielding some tastes from dependent type theory.
- On the usefulness of such idioms in practice, see HaskellDB's pages