On Thu, Mar 3, 2011 at 10:14 PM, wren ng thornton <wren@freegeek.org> wrote:
On 3/3/11 2:58 AM, Antti-Juhani Kaijanaho wrote:
On Thu, Mar 03, 2011 at 12:29:44PM +0530, Karthick Gururaj wrote:
Thanks - is this the same "unit" that accompanies IO in "IO ()" ? In
any case, my question is answered since it is not a tuple.

It can be viewed as the trivial 0-tuple.

Except that this is problematic since Haskell doesn't have 1-tuples (which would be distinct from plain values in that they have an extra bottom).


I don't get this line of thought.  I understand what you're saying, but why even bother trying to distinguish between bottoms when they can't be compared by equality, or even computed? The type (forall a . a) doesn't contain any values!   It is empty, and so is a subset of any other type.  If you choose to interpret all bottoms as being the same non-existent, unquantifiable (in the language of Haskell) "proto-value", you get the isomorphism between types a and (a), as types.  Indeed, those are the semantics in use by the language.  A value written (a) is interpreted as a.  A type written (a) is interpreted as a.  

In an idealized world, yes, unit can be thought of as the nullary product which serves as left- and right-identity for the product bifunctor. Unfortunately, Haskell's tuples aren't quite products.[1]

I'm not seeing this either.  (A,B) is certainly the Cartesian product of A and B.  In what sense are you using "product" here? Is your complaint a continuation of your previous (implicit) line of thought regarding distinct bottoms?