-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlittle-monads-identity.rkt
81 lines (64 loc) · 1.25 KB
/
little-monads-identity.rkt
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#lang racket
;;; Make experiments using
;;;
;;; A Schemer’s View of Monads
;;; Daniel P. Friedman & Adam C. Foltzer
;;; 2010, 2011
(define p
(lambda a
(map (lambda (x)
(display (~a x ":")))
a)
(newline)))
;;; IDENTITY MONAD
(begin
(p "One")
(p "Two"))
(p "IDENTITY-MONAD--BEGIN")
((lambda (_)
(p "Two"))
(p "One"))
(p)
(define mybegin
(lambda (x f)
(f x)))
(mybegin (p "One")
(lambda (_) (p "Two")))
(p)
(mybegin (p "One")
(lambda (_) (mybegin (p "Two")
(lambda (_) (p "Three")))))
(p "IDENTITY-MONAD--LET")
(let ([x 5])
(+ x 3))
(p)
((lambda (x)
(+ 3 x))
5)
(define mylet
(lambda (x f)
(f x)))
(mylet 5
(lambda (x) (+ x 3)))
(mylet 5
(lambda (x)
(mylet x
(lambda (y)
(+ x y)))))
(p "IDENTITY-MONAD--BIND/UNIT")
(define bind-id
(lambda (x sequel)
(sequel x)))
(define unit-id
(lambda (x)
x))
(bind-id (p "One")
(lambda (_)
(bind-id (p "Two")
(lambda (_)
(unit-id (p "Three"))))))
(bind-id (unit-id 5)
(lambda (x)
(bind-id (unit-id x)
(lambda (y)
(unit-id (+ x y))))))