Образует ли Exclusive-Or моноид для Bools?

Я сделал оператор для функции xor, это выглядит так:

op :: Integer -> Integer -> Maybe Integer
op x y
  | x == 0 && y == 0 = Just 0
  | x == 0 && y == 1 = Just 1
  | x == 1 && y == 0 = Just 1
  | x == 1 && y == 1 = Just 0
  | otherwise = Nothing

Я использовал 0 и 1 вместо True и False, но это не должно иметь значения для результата. Я читаю это образует моноид, но я не понимаю, почему. Ассоциативность очевидна и не нуждается в доказательстве (я уже сделал доказательство самостоятельно), но что такое элемент идентичности и почему?

Изменить: вот один без номеров:

xor :: Bool -> Bool -> Bool
xor x y | x == True && y == False = True
        | x == False && y == True = True
        | otherwise = False

1 ответ

Решение

Я допустил глупую ошибку в своем доказательстве, поскольку Амаллой сказал, что личность ложная. Вот полное доказательство, я надеюсь, что сейчас это правильно.

mempty <> p = p
xor False p = p
-- For p = True:
xor False True = True
True = True
-- For p = False:
xor False False = False
False = False
-- Q.E.D
Другие вопросы по тегам