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
.
我的问题是,如何在接口/签名中编写选择列表的类型声明
编译器试图告诉您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 ]
(根据我的经验,这类结构很快就会变得棘手。)