module Control.Category.Product where import Prelude hiding (id) import Control.Category infixr 3 *** class Category c => Tensor c where -- requires (fl *** fr) . (gl *** gr) === (fl . gl) *** (fr . gr) -- and id *** id === id (***) :: c w x -> c y z -> c (w, y) (x, z) first :: c w x -> c (w,z) (x,z) first = (*** id) second :: c y z -> c (w,y) (w,z) second = (id ***) instance Tensor (->) where (***) f g (w, y) = (f w, g y)