2012-12-29 48 views
1

我謹代表一組函數和他們類型規則,以及正在考慮的數據結構的...例如,表示一組功能及其類型規則

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-integer),一個前提,一個結論和一個優先級。可能有兩個分享規則具有相同的前提,但給出不同的結論,在這種情況下,這是優先考慮的因素。

後來,我需要這樣定義功能:

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)它是一個好主意,定義rulesrule列表,與ARRA比較Y ...關於funcrules之間的關係

2),有幾種選擇:讓rulesfunc一個記錄字段;使func作爲rule的記錄字段;製作funcrules的哈希表;製作從funcrules的地圖。我真的不知道哪種方式比較好...

另一方面我需要考慮的是該數據庫的啓動,有很多進入,所以我希望我選擇的類型將啓動容易進入並期待直線前進...

誰能幫助?

回答

3

1 - 使用數組或列表,或者別的什麼,取決於你打算如何訪問底層數據。

如果您需要規則隨機索引訪問,而該數據集並沒有改變太多使用array。如果數據集定期重建,並且您按順序訪問元素,請使用list。如果您不是整數的連續範圍別的東西需要指數的元素,使用assoc list,一個maphashtable

2 - 和上面一樣,它最終取決於訪問模式。選擇算法中看起來最爲方便的一種,如果碰巧在一段時間後碰巧是錯誤的選擇,不要害怕重構代碼。

順便說一句,如果需要的話rulesfunc類型可以interdependant,如例如:

type func = { 
    rules : rule list; 
    (* ... *) 
} 
and rule = { 
    funcs : func list; 
    (* ... *) 
};;