Это вполне может быть решением, ищущим проблему... если это так, я прошу вашего снисхождения!
Возможная реализация:
class Switch' f where
switch :: f a -> f ()
instance Switch' [] where
switch [] = [()]
switch (_:_) = []
instance Switch' Maybe where
switch Nothing = Just ()
switch (Just _) = Nothing
Интерпретация будет: при успешном вычислении сделать ее неудачной; учитывая неудачное вычисление, сделайте его успешным. Я не уверен, но похоже, что это может быть что-то вроде противоположности MonadPlus... если вы сильно усмехнулись.???
Существует ли стандартная модель или другая реализация для этой концепции? Что бы выглядела нижележащая математика, если таковая имеется (т.е. Это полугруппа, цикл и т.д.)?