infixr 3 &&
infixr 2 ||
infixr 3 `xor`
class Boolean a where
(&&) :: a -> a -> a
(||) :: a -> a -> a
data Trivalent
= TriFalse
| TriUnknown
| TriTrue
deriving (Show, Eq, Ord)
instance Boolean Trivalent where
TriFalse && _ = TriFalse
_ && TriFalse = TriFalse
TriTrue && TriTrue = TriTrue
_ && _ = TriUnknown
TriTrue || _ = TriTrue
_ || TriTrue = TriTrue
TriFalse || TriFalse = TriFalse
_ || _ = TriUnknown
not TriUnknown
= TriUnknown
instance Boolean
Bool where
xor :: Boolean a => a -> a -> a
a `xor` b
= not a
&& b
|| not b
&& a
main = do
print $ TriTrue
&& TriFalse
print $ not (TriUnknown
|| TriFalse
&& TriTrue
) print $ 2 < 3 `xor` False
print $ map (&& TriTrue
) [TriTrue
, TriFalse
, TriUnknown
]
aW1wb3J0IFByZWx1ZGUgaGlkaW5nICgoJiYpLCAofHwpLCBub3QpCmltcG9ydCBxdWFsaWZpZWQgUHJlbHVkZQoKaW5maXhyIDMgICYmCmluZml4ciAyICB8fAppbmZpeHIgMyAgYHhvcmAKCmNsYXNzIEJvb2xlYW4gYSB3aGVyZQogICAgKCYmKSA6OiBhIC0+IGEgLT4gYQogICAgKHx8KSA6OiBhIC0+IGEgLT4gYQogICAgbm90IDo6IGEgLT4gYQoKZGF0YSBUcml2YWxlbnQgPSBUcmlGYWxzZSB8IFRyaVVua25vd24gfCBUcmlUcnVlIGRlcml2aW5nIChTaG93LCBFcSwgT3JkKQoKaW5zdGFuY2UgQm9vbGVhbiBUcml2YWxlbnQgd2hlcmUKICAgIFRyaUZhbHNlICYmIF8gPSBUcmlGYWxzZQogICAgXyAmJiBUcmlGYWxzZSA9IFRyaUZhbHNlCiAgICBUcmlUcnVlICYmIFRyaVRydWUgPSBUcmlUcnVlCiAgICBfICYmIF8gPSBUcmlVbmtub3duCiAgICBUcmlUcnVlIHx8IF8gPSBUcmlUcnVlCiAgICBfIHx8IFRyaVRydWUgPSBUcmlUcnVlCiAgICBUcmlGYWxzZSB8fCBUcmlGYWxzZSA9IFRyaUZhbHNlCiAgICBfIHx8IF8gPSBUcmlVbmtub3duCiAgICBub3QgVHJpVHJ1ZSA9IFRyaUZhbHNlCiAgICBub3QgVHJpRmFsc2UgPSBUcmlUcnVlCiAgICBub3QgVHJpVW5rbm93biA9IFRyaVVua25vd24KCmluc3RhbmNlIEJvb2xlYW4gQm9vbCB3aGVyZQogICAgKCYmKSA9IChQcmVsdWRlLiYmKQogICAgKHx8KSA9IChQcmVsdWRlLnx8KQogICAgbm90ID0gUHJlbHVkZS5ub3QKCnhvciA6OiBCb29sZWFuIGEgPT4gYSAtPiBhIC0+IGEKYSBgeG9yYCBiID0gbm90IGEgJiYgYiB8fCBub3QgYiAmJiBhCgptYWluID0gZG8KICAgIHByaW50ICQgVHJpVHJ1ZSAmJiBUcmlGYWxzZQogICAgcHJpbnQgJCBub3QgKFRyaUZhbHNlIHx8IFRyaVVua25vd24pCiAgICBwcmludCAkIG5vdCAoVHJpVW5rbm93biB8fCBUcmlGYWxzZSAmJiBUcmlUcnVlKQogICAgcHJpbnQgJCAyIDwgMyBgeG9yYCBGYWxzZQogICAgcHJpbnQgJCBtYXAgKCYmIFRyaVRydWUpIFtUcmlUcnVlLCBUcmlGYWxzZSwgVHJpVW5rbm93bl0KICAgIHByaW50ICQgbWFwICgmJiBUcnVlKSBbVHJ1ZSwgRmFsc2VdCg==