2011-11-02 37 views
5

1) aşağıdaki gibi açık bir birlik tanımlanmıştır:Tip tanımları

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

Sonra bir tür choice_list tanımlamak deneyin:

type choice_list = choice list 

çalışmaz hangi. Bileşenlerden bir veya daha fazlasının açık sendikalar olduğu türleri nasıl tanımlar?

2),

val choice_handler : choice list -> int 

bunun yerine choice_list türü oluşturarak vazgeçmek ve bir seçim listesini kullanarak bir arayüz/imza beyanı yazarken deneyin zaman sadece bir choice list kullanmak derleyici type 'a choice = 'a constraint 'a = [> `One | `Other ] is not included in type infection_state. They have different arities şikâyet ederse.

Sorum şu ki, bir arabirim/imzadaki seçim listesinin tür beyanı nasıl yazılır.

cevap

9

Derleyici, choice'un parametreli bir tür olduğunu size anlatmaya çalışıyor. Tip seviyesinde, 1'in bir geriliği vardır. Diğer bir deyişle, bir tip parametresi sağlamanız gerekir. herhangi türü olabilir bundan daha Sen [`One|`Other] bir alt tipi olduğu parametreyi kısıtlı, ancak diğer adres: Eğer bir seçenekler listesi tanımlamak isterseniz

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

, ekstra tip bir yerden gelmek zorundadır.

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

(inşaatlar Bu tür Tecrübelerime göre zor oldukça hızlı olsun.)

: yani, yeni tip bir parametre olmak zorunda