summaryrefslogtreecommitdiff
path: root/080_blog/00120_Lambda-Calculus-(Haskell)/index.md
blob: 25c6b830fccf2945828d72c21dbe1cc2118b7ba0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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