forked from trueagi-io/hyperon-experimental
-
Notifications
You must be signed in to change notification settings - Fork 0
/
d1_gadt.metta
98 lines (83 loc) · 2.41 KB
/
d1_gadt.metta
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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Basic types of grounded symbols
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; `get-type` returns the type of its argument
!(assertEqual
(get-type 5)
Number)
!(assertEqual
(get-type (+ 5 7))
Number)
; It works for built-in symbols too
!(assertEqual
(get-type +)
(-> Number Number Number))
; If its argument is a badly typed expression,
; `get-type` returns the empty set
!(assertEqualToResult
(get-type (+ 5 "4"))
())
!(assertEqualToResult
(get-type (+ -))
())
; Also works for custom types
(: Either Type)
!(assertEqual
(get-type Either)
Type)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Arrow types of functions and constructors
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(: Left (-> %Undefined% Either))
(: Right (-> %Undefined% Either))
!(assertEqual
(get-type (Left 5))
Either)
(: isLeft (-> Either Bool))
(= (isLeft (Left $x)) True)
(= (isLeft (Right $x)) False)
!(assertEqual
(get-type (isLeft (Right 5)))
Bool)
; Badly typed expression
!(assertEqualToResult
(get-type (isLeft 5))
())
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Parameterized types
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(: EitherP (-> $t Type))
(: LeftP (-> $t (EitherP $t)))
(: RightP (-> $t (EitherP $t)))
!(assertEqual
(get-type (LeftP 5))
(EitherP Number))
(: Pair (-> $a $b Type))
(: pair (-> $a $b (Pair $a $b)))
!(assertEqual
(get-type (pair (LeftP 5) "String"))
(Pair (EitherP Number) String))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Recursively parameterized types
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(: List (-> $a Type))
(: Nil (List $a))
(: Cons (-> $a (List $a) (List $a)))
!(assertEqual
(get-type (Cons 5 (Cons 6 Nil)))
(List Number))
!(assertEqualToResult
(get-type (Cons 5 (Cons "6" Nil)))
())
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; `let` can be convenient to extract information from `get-type` results
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
!(assertEqual
(let (List $t) (get-type (Cons 5 (Cons 6 Nil)))
$t)
Number)