OCaml:未指定的类型变量

时间:2014-03-09 15:56:13

标签: ocaml

无论如何定义一个与OCaml中任何类型相匹配的变量?

我想出了这个:type term = Save of '_

阅读this tutorial

但它不起作用。

错误:语法错误

有人可以告诉我为什么我上面的代码中有错误吗?

2 个答案:

答案 0 :(得分:4)

每个类型变量都匹配OCaml中的“任何类型”。但是,必须绑定类型定义中的所有类型变量,通常作为参数:

type 'a term = Save of 'a

此处定义的数据构造函数将具有类型Save : 'a -> 'a term。因此,在类型int term的值中,已知构造函数带有整数。

但我不确定你想要达到的目标。也许你还想要一个存在类型,它“忘记”变量实例化的类型?然后你需要使用GADT语法:

type term = Save : 'a -> term

此处,数据构造函数将具有类型Save : 'a -> term。但是,这种类型并不是特别有用,因为你以后不能对构造函数的参数做任何事情,因为当你匹配它时它将是完全抽象的(因为它可以是任何东西,并且没有办法告诉它在那一点上是什么 - 与上述类型不同)。因此,如果不了解您的用例,很难给出更好的答案。

答案 1 :(得分:3)

单个下划线_更多的是操作符(通常是模式)而不是OCaml中的标识符。这就是你的语法问题。此外,类型变量名称不能以下划线开头。如果您更改为'a这样的合法名称,则会看到以下内容:

# type term = Save of 'a;;
Error: Unbound type parameter 'a
# 

一点也不清楚你想要做什么,但最简单的定义与你提供的相似可能是这样的:

# type 'a term = Save of 'a;;
type 'a term = Save of 'a

然后您可以将任何类型的值作为内容:

# Save 33;;
- : int term = Save 33
# Save "yes";;
- : string term = Save "yes"
# 

我怀疑你正在尝试做比这更好的事情,但如果是这样的话,你需要更仔细地解释它(至少对我来说: - )。