(* Pairs as functions *) (* Almost a Church encoding *) (* Author: Frank Pfenning *) (* Based on a student's idea *) datatype ('a,'b) sum = inl of 'a | inr of 'b val rec error : unit -> 'a = fn () => error () type ('a,'b) pair = ('a -> 'b -> ('a,'b) sum) -> ('a,'b) sum fun pair (x:'a) (y:'b) : ('a,'b) pair = fn f => f x y fun fst (p:('a,'b) pair) : 'a = case p (fn x => fn y => inl x) of inl x => x | inr y => error () fun snd (p:('a,'b) pair) : 'b = case p (fn x => fn y => inr y) of inl x => error () | inr y => y val p12 = pair 1 2; val one = fst p12; val two = snd p12; val p1t = pair 1 true; val one = fst p1t; val t = snd p1t; val ptf = pair true false; val t = fst ptf; val f = snd ptf;