-
Notifications
You must be signed in to change notification settings - Fork 0
/
little-monad-1.rkt
111 lines (95 loc) · 2.33 KB
/
little-monad-1.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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#lang racket
(pretty-print-columns 30)
(define traverse
(lambda (t s)
(cond ((null? t)
(cons '(END) s))
((integer? t)
(let ((m (max t s)))
(cons m m)))
(else
(let ((l (traverse (car t) s)))
(let ((r (traverse (cdr t) (cdr l))))
(cons (cons (car l) (car r))
(cdr r))))))))
(define data0 '(1 0 2 1 3 7 4 5 6 9 0 1 2 3))
(define data1 '(1 0 2 1
(1 0 2 1 3 7 4 5 6 0 1 2 3)
3 7 4 5 6 9 0 1 2 3))
(define test
(lambda (data)
(display data)
(newline)
(pretty-print
(car (traverse data 0)))))
;; (test data1)
;; (test data0)
(define unit
(lambda (v)
(lambda (s)
(cons v s))))
(define unit-max
(lambda (v)
(lambda (s)
(let ((m (max v s)))
(cons m m)))))
(define pipe
(lambda (m w)
(lambda (s)
(let ((l (m s)))
((w (car l)) (cdr l))))))
(define traverse//
(lambda (t)
(cond ((null? t) (unit '(END)))
((integer? t) (unit-max t))
(else
(pipe (traverse// (car t))
(lambda (a)
(pipe (traverse// (cdr t))
(lambda (d)
(unit (cons a d))))))))))
(define test//
(lambda (data)
(display data)
(newline)
(pretty-print
(car ((traverse// data) 0)))
(equal?
(car ((traverse// data) 0))
(car (traverse data 0)))))
;; (test// data1)
;; (test data0)
(define unit///
(lambda (v)
(lambda (s)
(cons v s))))
(define unit-max///
(lambda (v)
(lambda (s)
(cons (max v s) (max v s)))))
(define pipe///
(lambda (m q)
(lambda (s)
(let ((pair (m s)))
(let ((w (q (car pair))))
(w (cdr pair)))))))
(define traverse///
(lambda (t)
(cond ((null? t) (unit/// '(END)))
((integer? t) (unit-max/// t))
(else
(pipe/// (traverse/// (car t))
(lambda (a)
(pipe/// (traverse/// (cdr t))
(lambda (d)
(unit (cons a d))))))))))
(define test///
(lambda (data)
(display data)
(newline)
(pretty-print
(car ((traverse/// data) 0)))
(equal?
(car ((traverse/// data) 0))
(car (traverse data 0)))))
(test/// data1)