Daniel Peebles wrote:
The existential is a pair where one component is a type, and the type of the
second component depends on the value (i.e., which type went in the first
component) of the first. It's often called a sigma type when you have full
dependent types.

Not quite. Strong-sigma is a dependent pair where you can project both elements. Weak-sigma is a dependent pair where you can only project the first element (because the second is erased). Existentials are dependent pairs where you can only project the second component (because the first is erased).

Strong-sigma is often just called "sigma" because it's the assumed default case. Weak-sigma is used for refinement types, where the second component is a proof that some property holds for the first element. Existentials are special because they don't allow you to recover the witness.

    fst
        :: (A :: *)
        -> (B :: A -> *)
        -> (p :: StrongSig A B)
        -> A

    snd
        :: (A :: *)
        -> (B :: A -> *)
        -> (p :: StrongSig A B)
        -> B (fst p)

    elim
        :: (A :: *)
        -> (B :: A -> *)
        -> (_ :: Exists A B)
        -> (C :: *)
        -> (_ :: (a :: A) -> B a -> C)
        -> C

Notice how we only get the Church-encoding for existential elimination and how 'a' cannot appear in 'C'. Whereas for 'snd' we explicitly allow 'fst p' to escape.

--
Live well,
~wren
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to