[Haskell-cafe] Haskell type system and Barendregt's Lambda Cube classification

Dan Doel dan.doel at gmail.com
Fri Dec 25 14:48:20 EST 2009


On Friday 25 December 2009 11:35:38 am Vladimir Ivanov wrote:
> Dear All,
> 
> Recently, I've been playing with self-application and fixed-point
> combinators definition in Haskell.
> 
> It is possible to type them in Haskell using recursive types.
> 
> I took Y & U combinators:
> > newtype Rec a = In { out :: Rec a -> a }
> >
> > u :: Rec a -> a
> > u x = out x x
> >
> > y :: (a -> a) -> a
> > y f = let uf = f . u in uf (In uf)
> 
> Recursive types are part of System F-omega, which corresponds to
> lambda omega in Barendregt's Lambda Cube.
> For all type systems in Lambda Cube it is proven that they are
> strongly normalizing. But using "y" I can easily construct a term even
> without a normal form.
> 
> So, I got a contradition and conclude that type system implementation
> in Haskell contains something, that is absent from System F-omega.
> 
> My question is: what's particular feature in Haskell type system, that
> breaks strong normalization property? Or am I totally wrong
> classifying it in terms of Lambda Cube?

General recursive types are not part of F_omega. It only has...

    1) Type functions of arbitrary order
      /\ F : * -> *. /\ T : *. F T
    2) Universal quantification over the above spaces
      Pi F : * -> *. Pi T : (* -> *) -> *. T F

You can encode inductive and coinductive types in such a type system. If F is 
the shape functor, then the encoding of the inductive type is:

  Pi R : *. (F R -> R) -> R

and the encoding of the coinductive type is:

  Ex R : *. F R * R

where:

  Ex R : *. T[R] = Pi Q : *. (Pi R : *. T[R] -> Q) -> Q

and:

   A * B = Pi R : *. (A -> B -> R) -> R

(and

   A + B = Pi R : *. (A -> R) -> (B -> R) -> R

if you need it to encode F R, although often one may be able to massage F into 
a more suitable form to avoid using the * and + encodings).

However, as you can imagine, Rec cannot be encoded. Allowing such types adds 
general recursion back in. In type theories that do support Haskell-alike 
algebraic/(co)inductive definitions (which none in the lambda cube do; they're 
plain lambda calculi), the total ones restrict what types you can declare (to 
strictly positive types, usually) to make types like Rec illegal.

-- Dan


More information about the Haskell-Cafe mailing list