summaryrefslogtreecommitdiff
path: root/00_blog/00040_Haskell/00120_Lambda-Calculus/index.md
blob: b86950ffabbcaf991f18d692cf62229829c5bd19 (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
39
    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]](#ref).

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.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"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

## Ref

* [1] <https://en.wikipedia.org/wiki/Lambda_calculus>