我想代表一组函数及其输入规则,并考虑数据结构...例如,
For function "PLUS":
PLUS-integer: Integer -> Integer -> Integer, with priority high
PLUS-boolean: Boolean -> Boolean -> Integer, with priority high
...
For function "Unary Minus":
UM-0: Integer -> Integer, with priority high
UM-1: Date -> Date, with priority high
...
For function "Unary Minus":
UM-error: Date -> Error, with priority low
...
一些评论:功能和规则的名称始终是唯一的;一个函数(例如PLUS)总是具有固定数量的参数,并且可以具有与其相关的若干键入规则;打字规则有一个名称(例如PLUS整数),一个前提,一个结论和一个优先级。可能有2个打字规则有相同的前提,但给出不同的结论,在这种情况下,它是优先权,使差异。
稍后,我需要定义如下函数:
add_rule: add a rule to a function
get_rules: get all the rules from a function
get_first_rule: get the most priority rule from a function and a premise
get_conclusions: get all the conclusions that a function can give
get_errors: get all the rules whose conclusion is an error
get_function: get the function from a typing rule
set_priority: set a priority for a rule
...
为此目的,我不知道是否有一种传统方式来定义这些类型......目前,我想象一种方法如下:
type func =
{ name: string;
... }
type rule =
{ name: string;
premise: Type.t list;
conclusion: Type.t;
priority: Priority.t
... }
type rules = rule list
几个问题:
1)与数组相比,将rules
定义为rule
列表是个好主意...
2)关于func
和rules
之间的关系,有几种选择:将rules
作为func
的记录字段;将func
作为rule
的记录字段;制作func
和rules
的哈希表;制作从func
到rules
的地图。我真的不知道哪条路更好......
我需要考虑的另一个方面是启动这个数据库,还有很多要输入的内容,所以我希望我选择的类型能让初始化很容易进入并且看起来很直接......
有人可以帮忙吗?
答案 0 :(得分:3)
1 - 使用数组或列表或其他内容取决于您打算如何访问基础数据。
如果您需要对规则进行随机索引访问,并且数据集变化不大,请使用array
。如果定期重建数据集,并按顺序访问元素,请使用list
。如果您需要使用除连续范围的整数之外的其他内容来索引元素,请使用assoc list
,map
或hashtable
2 - 与上述相同,最终取决于访问模式。选择算法中最方便的东西,如果一段时间后恰好是错误的选择,不要害怕重构代码。
顺便说一句,如果需要,rules
和func
类型可以相互依赖,例如:
type func = {
rules : rule list;
(* ... *)
}
and rule = {
funcs : func list;
(* ... *)
};;