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>
|