A categorical programming language
修订版 | 8f46d9690f137bd171003b4d4754d017a75b9b81 (tree) |
---|---|
时间 | 2021-08-14 09:19:57 |
作者 | Corbin <cds@corb...> |
Commiter | Corbin |
Add map() functor on lists.
A little bit of abstract thought suggests that fold() isn't enough to do
this, but I'm very open to constructive proofs otherwise.
@@ -50,6 +50,7 @@ Given x : 1 → X and f : X → X, pr(x, f) : N → X | ||
50 | 50 | |
51 | 51 | nil : 1 → [X] |
52 | 52 | cons : X × [X] → X |
53 | +Given f : X → Y, map(f) : [X] → [Y] | |
53 | 54 | Given x : 1 → Y and f : X × Y → Y, fold(x, f) : [X] → Y |
54 | 55 | |
55 | 56 | Combinators with (*) are provided by OCaml by default; the others are in a |
@@ -26,6 +26,7 @@ with open("stub.scm", "r", encoding="utf-8") as handle: | ||
26 | 26 | with open(sys.argv[-2], "r", encoding="utf-8") as handle: |
27 | 27 | program = handle.read().strip() |
28 | 28 | program = program.replace("cons", "cammy-cons") |
29 | + program = program.replace("map", "cammy-map") | |
29 | 30 | print("(define program {})".format(program)) |
30 | 31 | |
31 | 32 | print(""" |
@@ -4,7 +4,7 @@ module CodeCache = Map.Make (String) | ||
4 | 4 | |
5 | 5 | let primitives = |
6 | 6 | "id comp ignore fst snd pair left right case assl assr swap dup curry \ |
7 | - uncurry app name zero succ for nil cons fold t f not conj disj" | |
7 | + uncurry app name zero succ for nil cons map fold t f not conj disj" | |
8 | 8 | |
9 | 9 | let filter = |
10 | 10 | List.fold_left |
@@ -0,0 +1 @@ | ||
1 | +(case (comp ignore t) (comp ignore f)) |
@@ -25,4 +25,5 @@ let succ n = S n | ||
25 | 25 | let rec pr x f n = match n with O -> x () | S p -> f (pr x f p) |
26 | 26 | let nil () = [] |
27 | 27 | let cons (x, xs) = x :: xs |
28 | +let map f = List.map f | |
28 | 29 | let fold x f = List.fold_left (fun y z -> f (z, y)) (x ()) |
@@ -30,6 +30,7 @@ | ||
30 | 30 | |
31 | 31 | (define nil (lambda (x) '())) |
32 | 32 | (define cammy-cons (lambda (xy) (cons (car xy) (cdr xy)))) |
33 | +(define (cammy-map f) (lambda (l) (map f l))) | |
33 | 34 | (define (fold x f) |
34 | 35 | (lambda (l) (if (null? l) (x '()) (f (cons (car l) ((fold x f) (cdr l))))))) |
35 | 36 |
@@ -1,5 +1,4 @@ | ||
1 | 1 | * list/eq : [X × X, 2] → [[X] × [X], 2] |
2 | 2 | * list/zip : [X] × [Y] → [X × Y] |
3 | -* list/map : [X, Y] → [[X], [Y]] | |
4 | 3 | * list/tail : [X] → [X] |
5 | 4 | * rat |