Skip to content

Commit ba86c7b

Browse files
Reason edition: snippets chapter 3.5
1 parent 2e76f4b commit ba86c7b

38 files changed

+167
-1
lines changed

src/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ ocaml: suffix='-ocaml'
5555
ocaml: clean out-dir version.tex $(OCAMLPDF)
5656

5757
reason: suffix='-reason'
58-
reason: out-dir version.tex $(REASONPDF)
58+
reason: clean out-dir version.tex $(REASONPDF)
5959

6060
# Main targets
6161
$(TOPPDFFILES) : %.pdf : %.tex $(TEXFILES)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module List_Monad: Monad_Join = {
2+
type m('a) = list('a);
3+
4+
let join = List.concat;
5+
let return = a => [a];
6+
};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
let (>>=) = (xs, k) => List.concat(List.map(k, xs));
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module Pythagorean = {
2+
let ( let* ) = Fn.flip(Gen.flat_map);
3+
let (let+) = (x, f) => Gen.map(f, x);
4+
let guard = b => b ? Gen.return() ? Gen.empty;
5+
6+
let triples = {
7+
let* z = Gen.init(i => i + 1);
8+
let* x = Gen.init(~limit=z, i => i + 1);
9+
let* y = Gen.init(~limit=z, i => i + x);
10+
let+ _ = guard(x * x + y * y == z * z);
11+
Gen.return((x, y, z));
12+
};
13+
};
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
let guard =
2+
fun
3+
| true => [()]
4+
| false => [];
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
module Pythagorean = {
2+
let ( let* ) = Fn.flip(Gen.flat_map);
3+
let (let+) = (x, f) => Gen.map(f, x);
4+
let guard = b => b ? Gen.return() : Gen.empty;
5+
6+
let triples = {
7+
let* z = Gen.init(i => i + 1);
8+
let* x = Gen.init(~limit=z, i => i + 1);
9+
let* y = Gen.init(~limit=z, i => i + x);
10+
if (x * x + y * y == z * z) {
11+
Gen.return((x, y, z));
12+
} else {
13+
Gen.empty;
14+
};
15+
};
16+
};
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
type reader('e, 'a) =
2+
| Reader('e => 'a);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
let run_reader = (Reader(f), e) => f(e);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
let (>>=) = (ra, k) => Reader(e => ...);
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
let (>>=) = (ra, k) => Reader(e => {
2+
let a = run_reader(ra, e);
3+
...
4+
});

0 commit comments

Comments
 (0)