Types 具有开放联合的类型定义

Types 具有开放联合的类型定义,types,ocaml,variant,Types,Ocaml,Variant,1) 我有一个开放联盟,定义如下: type 'a choice = [> `One | `Other ] as 'a 然后,我尝试定义一个类型选择列表: type choice_list = choice list 这是行不通的。如何定义一个或多个组件为开放联合体的类型 2) 如果我放弃创建选择列表类型,而只使用选择列表,当我尝试使用选择列表编写接口/签名语句时 val choice_handler : choice list -> int 编译器抱怨type'a choic

1) 我有一个开放联盟,定义如下:

type 'a choice = [> `One | `Other ] as 'a
然后,我尝试定义一个类型选择列表:

type choice_list = choice list
这是行不通的。如何定义一个或多个组件为开放联合体的类型

2) 如果我放弃创建
选择列表
类型,而只使用
选择列表
,当我尝试使用选择列表编写接口/签名语句时

val choice_handler : choice list -> int
编译器抱怨
type'a choice='a constraint'a=[>`One |`Other]未包含在type\u状态中。它们具有不同的算术数


我的问题是,如何在接口/签名中编写选择列表的类型声明。

编译器试图告诉您,
choice
是一种参数化类型。在类型级别,它的arity为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 ]
(根据我的经验,这类构造很快就会变得棘手。)