-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtype.hpp
150 lines (98 loc) · 2.52 KB
/
type.hpp
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#ifndef SLAP_TYPE_HPP
#define SLAP_TYPE_HPP
#include <set>
#include <functional>
#include "variant.hpp"
#include "list.hpp"
#include "symbol.hpp"
#include "environment.hpp"
#include "kind.hpp"
namespace type {
struct error : std::runtime_error {
using std::runtime_error::runtime_error;
};
struct unification_error : error {
using error::error;
};
struct logger;
struct mono;
struct poly;
struct constant;
struct variable;
struct application;
// monotypes
using cst = ref<constant>;
using var = ref<variable>;
using app = ref<application>;
struct mono : variant<cst, var, app> {
using mono::variant::variant;
::kind::any kind() const;
// convenience constructor for applications
mono operator()(mono arg) const;
};
struct constant {
const symbol name;
const ::kind::any kind;
constant(symbol name, ::kind::any k);
};
struct variable {
const std::size_t level;
const ::kind::any kind;
variable(std::size_t level, const ::kind::any kind);
};
struct application {
const mono ctor;
const mono arg;
application(mono ctor, mono arg);
};
// polytypes
struct poly {
using forall_type = std::set<var>;
const forall_type forall;
const mono type;
friend std::ostream& operator<<(std::ostream& out, const poly& self);
};
// constructors for literals
const extern mono unit, boolean, integer, real, string;
// higher kinded constructors
const extern mono func;
const extern mono io;
const extern mono record, sum, empty;
// reified type constructor
const extern mono ty;
mono ext(symbol attr);
// convenience: build function types
mono operator>>=(mono lhs, mono rhs);
// convenience: build row types
struct row {
const symbol attr;
const mono head;
row(symbol attr, mono head) : attr(attr), head(head) { }
mono operator|=(mono tail) const {
return ext(attr)(head)(tail);
}
};
// convenience: unpack record types
struct extension {
const symbol attr;
const mono head;
const mono tail;
static extension unpack(const app& self);
};
// debugging helper
struct logger {
std::ostream& out;
struct pimpl_type;
std::unique_ptr<pimpl_type> pimpl;
logger(std::ostream& out);
~logger();
template<class T>
logger& operator<<(const T& x) {
out << x;
return *this;
}
logger& operator<<(std::ostream& (*)(std::ostream&));
logger& operator<<(const poly& p);
};
}
#endif