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
|