-
Notifications
You must be signed in to change notification settings - Fork 82
/
catch_all.topscript
87 lines (87 loc) · 2.57 KB
/
catch_all.topscript
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
#silent true;;
#use "topfind";;
#thread;;
#camlp4o;;
#require "core";;
#require "core.top";;
#require "ppx_jane";;
#silent false;;
open Core_kernel;;
type basic_color =
| Black | Red | Green | Yellow | Blue | Magenta | Cyan | White;;
[%%expect ocaml {|
type basic_color =
Black
| Red
| Green
| Yellow
| Blue
| Magenta
| Cyan
| White
|}];;
let basic_color_to_int = function
| Black -> 0 | Red -> 1 | Green -> 2 | Yellow -> 3
| Blue -> 4 | Magenta -> 5 | Cyan -> 6 | White -> 7 ;;
[%%expect ocaml {|val basic_color_to_int : basic_color -> int = <fun>|}];;
[@@@part "1"];;
type color =
| Basic of basic_color (* basic colors *)
| Bold of basic_color (* bold basic colors *)
| RGB of int * int * int (* 6x6x6 color cube *)
| Gray of int (* 24 grayscale levels *)
;;
[%%expect ocaml {|
type color =
Basic of basic_color
| Bold of basic_color
| RGB of int * int * int
| Gray of int
|}];;
[@@@part "2"];;
let color_to_int = function
| Basic (basic_color,weight) ->
let base = match weight with Bold -> 8 | Regular -> 0 in
base + basic_color_to_int basic_color
| RGB (r,g,b) -> 16 + b + g * 6 + r * 36
| Gray i -> 232 + i ;;
[%%expect{|
Characters 38-58:
Error: This pattern matches values of type 'a * 'b
but a pattern was expected which matches values of type basic_color
|}];;
[@@@part "3"];;
let color_to_int = function
| Basic basic_color -> basic_color_to_int basic_color
| RGB (r,g,b) -> 16 + b + g * 6 + r * 36
| Gray i -> 232 + i ;;
[%%expect{|
Characters 19-148:
Warning 8: this pattern-matching is not exhaustive.
Here is an example of a case that is not matched:
Bold _
|};
ocaml {|val color_to_int : color -> int = <fun>|}];;
[@@@part "4"];;
let color_to_int = function
| Basic basic_color -> basic_color_to_int basic_color
| Bold basic_color -> 8 + basic_color_to_int basic_color
| RGB (r,g,b) -> 16 + b + g * 6 + r * 36
| Gray i -> 232 + i ;;
[%%expect ocaml {|val color_to_int : color -> int = <fun>|}];;
[@@@part "5"];;
let oldschool_color_to_int = function
| Basic (basic_color,weight) ->
let base = match weight with Bold -> 8 | Regular -> 0 in
base + basic_color_to_int basic_color
| _ -> basic_color_to_int White;;
[%%expect{|
Characters 48-68:
Error: This pattern matches values of type 'a * 'b
but a pattern was expected which matches values of type basic_color
|}];;
[@@@part "6"];;
let oldschool_color_to_int = function
| Basic basic_color -> basic_color_to_int basic_color
| _ -> basic_color_to_int White;;
[%%expect ocaml {|val oldschool_color_to_int : color -> int = <fun>|}];;