-
Notifications
You must be signed in to change notification settings - Fork 0
/
maybe_implem.rb
111 lines (86 loc) · 1.26 KB
/
maybe_implem.rb
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
class Maybe
private_class_method :new
def initialize(content)
@content = content
end
def from_maybe
@content.first
end
end
class Just < Maybe
def self.call(value)
new [value]
end
end
class Nothing < Maybe
def self.call()
new []
end
end
def what_is(box)
case box
when Nothing
puts "It's nothing dear."
when Just
puts "It's just #{box.from_maybe}."
end
end
what_is(Just.(3))
what_is(Nothing.())
def fmap(f)
->(box) do
case box
when Nothing
return Nothing.()
when Just
r = f.(box.from_maybe)
Just.(r)
end
end
end
f = ->(x) {Just.(x+2)}
g = ->(x) {Just.(x*x)}
def join(bbox)
case bbox
when Nothing
Nothing.()
when Just
bbox.from_maybe
end
end
def rfish(f, g)
->(x) do
join (fmap g).(f.(x))
end
end
id = ->(x) { x }
def bind(f, v)
join (fmap f).(v)
end
### listes
powers = ->(n) do
[n, n*n, n*n*n]
end
neighbors = ->(n) do
[n-1, n+1]
end
def fmap(f)
->(list) { list.map(&f) }
end
def join(llist)
llist.flatten(1)
end
def rfish(f, g)
->(x) { f.(x).map(&g).flatten }
end
def bind(f, v)
v.map(&f).flatten(1)
end
# Member bind:
class Array
def bind(&f)
return self.map(&f).flatten(1)
end
end
# Examples:
bind(powers, bind(powers, [2]))