@@ -125,6 +125,10 @@ class SemiIsoApply f => SemiIsoAlternative f where
125125
126126 {-# MINIMAL siempty, (/|/) #-}
127127
128+-- | An analogue of 'Monad' for 'SemiIsoFunctor'.
129+--
130+-- Because of the 'no throwing away' rule bind has to \"return\"
131+-- both @a@ and @b@.
128132class SemiIsoApply m => SemiIsoMonad m where
129133 (//=) :: m a -> (a -> m b) -> m (a, b)
130134 m //= f = swapped /$/ (f =// m)
@@ -132,14 +136,20 @@ class SemiIsoApply m => SemiIsoMonad m where
132136 (=//) :: (b -> m a) -> m b -> m (a, b)
133137 f =// m = swapped /$/ (m //= f)
134138
139+ {-# MINIMAL (//=) | (=//) #-}
140+
141+-- | A SemiIsoMonad with fixed point operator.
135142class SemiIsoMonad m => SemiIsoFix m where
136143 sifix :: (a -> m a) -> m a
137144 sifix f = dup /$/ (f =//= f)
138145 where dup = semiIso (\a -> Right (a, a)) (Right . fst)
139146
147+ -- | Fixed point combined with bind, it's so symmetric!
140148 (=//=) :: (a -> m b) -> (b -> m a) -> m (a, b)
141149 f =//= g = sifix (\(a, b) -> g b /*/ f a)
142150
151+ {-# MINIMAL sifix | (=//=) #-}
152+
143153-- | Equivalent of 'sequence'.
144154--
145155-- Note that it is not possible to write sequence_, because