May 2018
Playing with Type Quantifiers and Haskell’s Rank 2 Type Polymorphsim,
implementing Boolean logic from scratch. We use the conventional
definitions for True
an False
also known as
Church booleans, after Alonzo Church, who intruced them along Lambda
Calculus in the 1930s [1].
{-# LANGUAGE Rank2Types #-}
fTrue :: forall a. a->a->a
fTrue x y = x
fFalse :: forall a. a->a->a
fFalse x y = y
fAnd :: (forall a. a->a->a)->(forall a. a->a->a)->(forall a. a->a->a)
fAnd p q = p q p
fOr :: (forall a. a->a->a)->(forall a. a->a->a)->(forall a. a->a->a)
fOr p q = p p q
fNot :: (forall a. a->a->a)->(forall a. a->a->a)
fNot p = p fFalse fTrue
ifThenElse :: (forall a. a->a->a)->(forall a. a->a->a)
->(forall a. a->a->a)->(forall a. a->a->a)
ifThenElse p a b = p a b
-- Example --
main = print $ (ifThenElse fFalse fFalse $ fAnd fTrue $ fNot fFalse) "T" "F"