2011-11-02 11 views
5

1) Mam otwarty związek zdefiniowany następująco:definicje typu z otwartymi związków

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

I następnie spróbuj określić typ choice_list:

type choice_list = choice list 

który nie działa. W jaki sposób zdefiniować typy, w których jeden lub więcej składników jest otwartymi związkami?

2) Jeżeli zamiast tego rezygnują tworząc rodzaj choice_list, i po prostu użyć choice list, gdy próbuję piśmie oświadczenia interfejs/podpis przy użyciu listy wyboru,

val choice_handler : choice list -> int 

kompilator narzeka, że ​​type 'a choice = 'a constraint 'a = [> `One | `Other ] is not included in type infection_state. They have different arities.

Moje pytanie brzmi, w jaki sposób można zapisać deklarację typu listy wyboru w interfejsie/podpisie.

Odpowiedz

9

Kompilator próbuje powiedzieć, że choice jest parametryzowanym typem. Na poziomie typu ma wartość 1. Innymi słowy, musisz podać jeden parametr. Masz ograniczone parametr do podtypem [`One|`Other], ale poza tym może to być dowolny typ:

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

Jeśli chcesz zdefiniować listę wyboru, dodatkowy typ musi skądś. To znaczy, że musi być parametrem do nowego typu:

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

(Tego rodzaju konstrukcje się trudne dość szybko, w moim doświadczeniu).

Powiązane problemy