use operator name in print_fold
This commit is contained in:
parent
6ac8be6984
commit
e0b2dfe566
3 changed files with 36 additions and 2 deletions
2
dune
2
dune
|
@ -7,4 +7,4 @@
|
||||||
(public_name aoc2020)
|
(public_name aoc2020)
|
||||||
(inline_tests)
|
(inline_tests)
|
||||||
(modules (:standard \ aoc2020))
|
(modules (:standard \ aoc2020))
|
||||||
(preprocess (pps ppx_deriving.std ppx_expect)))
|
(preprocess (pps ppx_deriving.std ppx_inline_test ppx_expect)))
|
||||||
|
|
33
misc.ml
33
misc.ml
|
@ -19,13 +19,44 @@ type 'a monoid =
|
||||||
let mult = {id = 1; op = ( * ); op_name = "*"; pp = Format.pp_print_int}
|
let mult = {id = 1; op = ( * ); op_name = "*"; pp = Format.pp_print_int}
|
||||||
let add = {id = 0; op = ( + ); op_name = "+"; pp = Format.pp_print_int}
|
let add = {id = 0; op = ( + ); op_name = "+"; pp = Format.pp_print_int}
|
||||||
|
|
||||||
|
let fold_list {op; id; _} = List.fold_left op id
|
||||||
|
|
||||||
|
let%test _ = fold_list add [] = 0
|
||||||
|
let%test _ = fold_list add [1;2;3;4] = 10
|
||||||
|
let%test _ = fold_list mult [1;2;3;4] = 24
|
||||||
|
|
||||||
|
|
||||||
let print_fold mon xs =
|
let print_fold mon xs =
|
||||||
let res = List.fold_left mon.op mon.id xs in
|
let res = List.fold_left mon.op mon.id xs in
|
||||||
let rec go fmt = function
|
let rec go fmt = function
|
||||||
| [] -> Format.fprintf fmt "%a" mon.pp mon.id
|
| [] -> Format.fprintf fmt "%a" mon.pp mon.id
|
||||||
| [x] -> Format.fprintf fmt "%a" mon.pp x
|
| [x] -> Format.fprintf fmt "%a" mon.pp x
|
||||||
| x::xs -> Format.fprintf fmt "%a * %a" mon.pp x go xs in
|
| x::xs -> Format.fprintf fmt "%a %s %a" mon.pp x mon.op_name go xs in
|
||||||
Format.printf "%a = %a\n" go xs mon.pp res
|
Format.printf "%a = %a\n" go xs mon.pp res
|
||||||
|
|
||||||
let print_prod = print_fold mult
|
let print_prod = print_fold mult
|
||||||
let print_sum = print_fold add
|
let print_sum = print_fold add
|
||||||
|
|
||||||
|
let%expect_test _ =
|
||||||
|
print_prod [];
|
||||||
|
[%expect{| 1 = 1 |}]
|
||||||
|
|
||||||
|
let%expect_test _ =
|
||||||
|
print_prod [1];
|
||||||
|
[%expect{| 1 = 1 |}]
|
||||||
|
|
||||||
|
let%expect_test _ =
|
||||||
|
print_prod [1;2;3;4];
|
||||||
|
[%expect{| 1 * 2 * 3 * 4 = 24 |}]
|
||||||
|
|
||||||
|
let%expect_test _ =
|
||||||
|
print_sum [];
|
||||||
|
[%expect{| 0 = 0 |}]
|
||||||
|
|
||||||
|
let%expect_test _ =
|
||||||
|
print_sum [1];
|
||||||
|
[%expect{| 1 = 1 |}]
|
||||||
|
|
||||||
|
let%expect_test _ =
|
||||||
|
print_sum [1;2;3;4];
|
||||||
|
[%expect{| 1 + 2 + 3 + 4 = 10 |}]
|
||||||
|
|
3
misc.mli
3
misc.mli
|
@ -8,6 +8,9 @@ type 'a monoid =
|
||||||
op: 'a -> 'a -> 'a;
|
op: 'a -> 'a -> 'a;
|
||||||
op_name: string;
|
op_name: string;
|
||||||
pp: Format.formatter -> 'a -> unit}
|
pp: Format.formatter -> 'a -> unit}
|
||||||
|
|
||||||
|
val fold_list: 'a monoid -> 'a list -> 'a
|
||||||
|
|
||||||
val mult: int monoid
|
val mult: int monoid
|
||||||
val add: int monoid
|
val add: int monoid
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue