fork download
  1. import Prelude hiding ((&&), (||), not)
  2. import qualified Prelude
  3.  
  4. infixr 3 &&
  5. infixr 2 ||
  6. infixr 3 `xor`
  7.  
  8. class Boolean a where
  9. (&&) :: a -> a -> a
  10. (||) :: a -> a -> a
  11. not :: a -> a
  12.  
  13. data Trivalent = TriFalse | TriUnknown | TriTrue deriving (Show, Eq, Ord)
  14.  
  15. instance Boolean Trivalent where
  16. TriFalse && _ = TriFalse
  17. _ && TriFalse = TriFalse
  18. TriTrue && TriTrue = TriTrue
  19. _ && _ = TriUnknown
  20. TriTrue || _ = TriTrue
  21. _ || TriTrue = TriTrue
  22. TriFalse || TriFalse = TriFalse
  23. _ || _ = TriUnknown
  24. not TriTrue = TriFalse
  25. not TriFalse = TriTrue
  26. not TriUnknown = TriUnknown
  27.  
  28. instance Boolean Bool where
  29. (&&) = (Prelude.&&)
  30. (||) = (Prelude.||)
  31.  
  32. xor :: Boolean a => a -> a -> a
  33. a `xor` b = not a && b || not b && a
  34.  
  35. main = do
  36. print $ TriTrue && TriFalse
  37. print $ not (TriFalse || TriUnknown)
  38. print $ not (TriUnknown || TriFalse && TriTrue)
  39. print $ 2 < 3 `xor` False
  40. print $ map (&& TriTrue) [TriTrue, TriFalse, TriUnknown]
  41. print $ map (&& True) [True, False]
  42.  
Success #stdin #stdout 0.02s 3540KB
stdin
Standard input is empty
stdout
TriFalse
TriUnknown
TriUnknown
True
[TriTrue,TriFalse,TriUnknown]
[True,False]