Lennart Augustsson wrote:
Yes, early ML had nested pairs.  We introduced n-tuples in Lazy ML
because in a lazy language n-tuples are not isomorphic to nested pairs
(whereas they are in a strict language).  So n-tuples are nasty
because they are not inductive, but they are in many ways much more
reasonable than lazy nested pairs.

although it is possible in a slightly different (and less left-right symmetric) way in Haskell:
data P a b = P a !b
pair: P Int (P Bool ())
triple: P Char (P Int (P Bool ())
single: P Bool ()
unit: ()

BTW, early ML also had binary sums.  Again, they are not isomorphic to
n-ary sums.

data E a b = L a | R !b
data Z --since Haskell Prelude provides us with the unit type () but not the uninhabited "zero" type, I'll use GHC's EmptyDataDecls syntax for this.
either: E Int (E Bool Z)
3: E Char (E Int (E Bool Z)
1: E Bool Z
0: Z

Still, these don't have isomorphic *representations*: the efficiency is lacking. I wonder if it would be possible to allow {-#UNPACK#-} for those polymorphic arguments in such a way that either/both of the above were actually equivalent to n-tuple/sums.

-Isaac
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to