[Haskell-cafe] Restricted categories
Alexander Solla
ajs at 2piix.com
Sun Feb 21 00:05:44 EST 2010
On Feb 20, 2010, at 6:32 PM, Nick Rudnick wrote:
> A simple example:
> class Show el=> ExceptionNote el where
> comment:: Show exception=> exception-> el-> String
>
> instance ExceptionNote Int where
> comment exception refId = show refId ++ ": " ++ show exception
>
> Here you don't need to constrain «exception» to be of «Show» at the
> instance declaration. So it does not appear wrong for Sjoerd to
> expect f and g to already be of Suitable2...
There really are instances missing. The context is coming from here:
> The instance for Suitable2 restricts objects to IsProduct, and
> requires the Fst and Snd parts of the objects to be suitable in c1
> resp. c2:
>
>> instance (IsProduct a, IsProduct b, Suitable2 c1 (Fst a) (Fst b),
>> Suitable2 c2 (Snd a) (Snd b)) => Suitable2 (c1 :***: c2) a b where
>> data Constraints (c1 :***: c2) a b = (IsProduct a, IsProduct b,
>> Suitable2 c1 (Fst a) (Fst b), Suitable2 c2 (Snd a) (Snd b)) =>
>> ProdConstraints
>> constraints _ = ProdConstraints
Given types A and B, the product A x B has a type Fst which is A, and
a type Snd which is B -- by construction:
> class IsProduct p where
> type Fst p :: *
> type Snd p :: *
> fst :: p -> Fst p
> snd :: p -> Snd p
So, if we have two products named a and b, and a = A + B, b = C + D
(letting the first type in the addition be Fst, and the latter be Snd
in each), a x b has
four "components": (A x C) + (B x C) + (A x D) + (B x D).
a x b = (A | B) x (C | D) = (Fst a | Snd a) x (Fst b | Snd b) = (Fst
a, Fst b) + (Snd a, Fst b) + (Fst a, Snd b) + (Snd a, Snd b)
This really comes down to the semantics of Suitability2, but I think
Sjoerd made a logic mistake, and is trying to make a product out of a
pair of products, in stead of a pair of categories.
More information about the Haskell-Cafe
mailing list