2011-11-02 44 views
5

1)我有一個開放的聯盟定義如下:開放工會類型定義

type 'a choice = [> `One | `Other ] as 'a 

然後我試圖定義一個類型choice_list:

type choice_list = choice list 

不工作。如何定義一個或多個組件是開放式工會的類型?

2)相反,如果我放棄創建choice_list類型,並且只使用一個choice list,當我嘗試寫的用一個選擇列表的接口/簽名聲明,

val choice_handler : choice list -> int 

編譯器抱怨type 'a choice = 'a constraint 'a = [> `One | `Other ] is not included in type infection_state. They have different arities

我的問題是,如何在接口/簽名中寫入選擇列表的類型聲明。

回答

9

編譯器試圖告訴您choice是一個參數化類型。在類型級別,它的元數爲1.換句話說,您需要提供一個類型參數。你已經制約了參數是[`One|`Other]一個亞型,但除此之外,它可以是任何類型:

# ([`One; `Third] : 'a choice list);; 
- : [> `One | `Other | `Third ] choice list = [`One; `Third] 

如果要定義的選項列表,額外的類型都有來自某處。即,它必須是新類型的參數:

# type 'a choice_list = 'a choice list;; 
type 'a choice_list = 'a choice list constraint 'a = [> `One | `Other ] 

(這些各種各樣的結構的變得棘手相當快速,以我的經驗。)