www.idziorek.net | blog | contact
May 2018

Lambda Calculus

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"

Ref