Problem 46 Solutions
Solution 1
-- True if and only if a and b are true
and' : Bool -> Bool -> Bool
and' a b =
a && b
-- True if either a or b are true
or' : Bool -> Bool -> Bool
or' a b =
a || b
-- True either a or b are false
nand' : Bool -> Bool -> Bool
nand' a b =
not (a && b)
-- True if and only if a and b are false
nor' : Bool -> Bool -> Bool
nor' a b =
not (a || b)
-- True if a or b is true, but not if both are true
xor' : Bool -> Bool -> Bool
xor' a b =
not (a == b)
-- True if a is false or b is true
implies : Bool -> Bool -> Bool
implies a b =
if a then b else True
-- True if both a and b are true, or both a and b ar false
equivalent : Bool -> Bool -> Bool
equivalent a b =
a == b
truthTable : (Bool -> Bool -> Bool) -> List (Bool, Bool, Bool)
truthTable f =
-- your implementation goes here
[ (True, True, f True True)
, (True, False, f True False)
, (False, True, f False True)
, (False, False, f False False)
]
Solution 2
It is common for functional programmers to write functions as a composition of other functions, never mentioning the actual arguments they will be applied to. This is called "pointfree style".
-- True if and only if a and b are true
and' : Bool -> Bool -> Bool
and' =
(&&)
-- True if either a or b are true
or' : Bool -> Bool -> Bool
or' =
(||)
-- True if both a and b are true, or both a and b are false
equivalent : Bool -> Bool -> Bool
equivalent =
(==)