Haskellなんだから積と和はやはり直積・直和にもとづいて定義したい。

* :: (S1 -> T1) -> (S2 -> T2) -> (S1,S2) -> (T1,T2)
(f * g) (x1,x2) = (f x1, g x2)

+ :: (S1 -> T) -> (S2 -> T) -> (S -> T)
where data S = Inl S1 | Inr S2
(f + g) x = case x of { Inl y -> f y; Inr y -> g y }

和がHaskellの構文でうまく書けないけど