Определения типов с открытыми объединениями - PullRequest
5 голосов
/ 02 ноября 2011

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.

У меня вопрос: как написать объявление типа списка выбора в интерфейсе / подписи.

1 Ответ

9 голосов
/ 02 ноября 2011

Компилятор пытается сказать вам, что 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 ]

(По моему опыту, такие конструкции довольно быстро запутываются.)

...