Я сделал для 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
False ^ x == x
, что вы легко можете исчерпывающе подтвердить. Но менее очевидно, что ассоциативность имеет место, и это может потребовать доказательства. Кроме того, это, возможно, целые числа - очень странный способ кодирования bools. - person amalloy   schedule 06.07.2017x
иy
, тоx `xor` y
является младшим битомx + y
. Отдельно вам следует посмотреть наData.Bits
, а также не использоватьInteger
для представления логического значения. - person dfeuer   schedule 06.07.2017X -> X -> X
сX
набором, над которым определен моноид. - person Willem Van Onsem   schedule 06.07.2017xor :: Eq a => a -> a -> Bool
xor x y = x /= y
- person Redu   schedule 06.07.2017xor = (/=)
. - person Willem Van Onsem   schedule 06.07.2017Data.Bits
правильно понял:xor :: Bits a => a -> a -> a
. - person dfeuer   schedule 06.07.2017xor
определено вData.Bits
пакете. - person Redu   schedule 06.07.2017Bool
, а не для всех типовEq
. - person Li-yao Xia   schedule 06.07.2017