Lambda Calculus =============== May 2, 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]. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.haskell .numberLines} {-# 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" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [1] https://en.wikipedia.org/wiki/Lambda_calculus