[Haskell-cafe] Re: Basic question concerning the category Hask
(was: concerning data constructors)
apfelmus
apfelmus at quantentunnel.de
Sun Jan 6 10:39:44 EST 2008
Yitzchak Gale wrote:
> I wrote:
>>> ...it was recently claimed on this list that tuples
>>> are not products in that category.
>
> I've not been convinced yet.
I'm going to try convince you :) The crucial problem of Haskell's
product is that (_|_,_|_) ≠ _|_ but that the two projections
fst :: (A,B) -> A
snd :: (A,B) -> B
cannot distinguish between both values. But if (,) were a categorial
product, fst and snd would completely determine it. We would have
the universal property that for every
f :: C -> A
g :: C -> B
there is a _unique_ morphism
f &&& g :: C -> (A,B)
subject to
f = fst . (f &&& g)
g = snd . (f &&& g)
In other words, there is a unique function
(&&&) :: forall c . (c -> A) -> (c -> B) -> (c -> (A,B))
f &&& g = \c -> (f c, g c)
In the particular case of C=(A,B), f=fst and g=snd , the identity
function is such a morphism which means
fst &&& snd = id
due to uniqueness. But
id _|_ ≠ id (_|_,_|_)
while clearly
(fst &&& snd) _|_ = (fst &&& snd) (_|_,_|_)
> Derek Elkins wrote:
>> Also, there is a Haskell-specific problem at the very get-go.
>> The most "obvious" choice for the categorical composition operator
>> assuming the "obvious" choice for the arrows and objects does not work...
>> ...This can
>> easily be fixed by making the categorical (.) strict in both arguments
>> and there is no formal problem with it being different from Haskell's
>> (.), but it certainly is not intuitively appealing.
Note that the problem with (.) is "seq's fault" (pun intended :)
Otherwise, it would be impossible to distinguish _|_ from its
eta-expansion \x._|_ .
Regards,
apfelmus
More information about the Haskell-Cafe
mailing list