
On Thu, Jun 23, 2011 at 1:15 PM, wren ng thornton
To put a different spin on it, in the dual case we can show that Haskell's (,) is not a categorical product. There's a good deal of historical debate about why it works the way it does, but if we're looking to make a better system then the fact that tuples are not well-behaved suggests a place for improvement. The current (,) is a compromise between two different notions of product in domain theory. On the one hand we have domain products (which do not produce domains) and on the other hand we have smash products (which can "lose" information). I've had in mind for a while to make a Haskell-like language with a total functional core. In a total language (even a lazy one), we don't have bottom so we don't need domain theory to reason about the language. So in a language which is only partially total, it's reasonable to have two different kinds of products--- which means we can get away from Haskell's compromise, but do so in a way that's harmonious with the rest of the language. Would this new system be "better"? I dunno. It would behave in a more lawful manner, so it should be easier to reason about; but then we're making programmers keep that reasoning in mind, and maybe that's too much work. A decent system has to be both correct but also usable, and human factors are messy and hard to predict.
Please read "Fast and Loose Reasoning is Morally Correct". http://www.comlab.ox.ac.uk/people/jeremy.gibbons/publications/fast+loose.pdf As I have told you before, it is perfectly appropriate to ignore bottom-the-type and bottoms-the-inexpressible proto-values to recover the categorical product semantics of (,). It's not even hard. It will make your life easier. All you have to do is apply an equivalence relation that considers all bottom-proto-values as equivalent. Domain theory is an unnecessary complication. All bottoms have the same semantics anyway -- they all diverge.