19 | interface Bifunctor ten => Associative ten where
20 | assocl : a `ten` (b `ten` c) -> (a `ten` b) `ten` c
21 | assocl = assoc.leftToRight
23 | assocr : (a `ten` b) `ten` c -> a `ten` (b `ten` c)
24 | assocr = assoc.rightToLeft
26 | assoc : a `ten` (b `ten` c) <=> (a `ten` b) `ten` c
27 | assoc = MkEquivalence assocl assocr
35 | interface Bifunctor ten => Symmetric ten where
36 | swap' : a `ten` b -> b `ten` a
37 | swap' = symmetric.leftToRight
39 | symmetric : a `ten` b <=> b `ten` a
40 | symmetric = MkEquivalence swap' swap'
50 | interface Associative ten => Tensor ten i | ten where
51 | unitl : i `ten` a <=> a
52 | unitr : a `ten` i <=> a
61 | Associative Pair where
62 | assocl (x,(y,z)) = ((x,y),z)
63 | assocr ((x,y),z) = (x,(y,z))
66 | Symmetric Pair where
70 | Tensor Pair () where
71 | unitl = MkEquivalence snd ((),)
72 | unitr = MkEquivalence fst (,())
81 | Associative Either where
82 | assocl (Left x) = Left (Left x)
83 | assocl (Right (Left x)) = Left (Right x)
84 | assocl (Right (Right x)) = Right x
86 | assocr (Left (Left x)) = Left x
87 | assocr (Left (Right x)) = Right (Left x)
88 | assocr (Right x) = Right (Right x)
91 | Symmetric Either where
92 | swap' = either Right Left
95 | Tensor Either Void where
96 | unitl = MkEquivalence (either absurd id) Right
97 | unitr = MkEquivalence (either id absurd) Left