Pair[A; B] = tuple[first: A, second: B]
proc apply[A1; A2; B1; B2](self: Pair[A1, A2]; f1: A1 -> B1; f2: A2 -> B2): Pair[B1, B2]
proc reduce[A; B; R](self: Pair[A, B]; reducer: (A, B) -> R): R
func pair[A; B](first: A; second: B): Pair[A, B]