无论如何定义一个与OCaml中任何类型相匹配的变量?
我想出了这个:type term = Save of '_
但它不起作用。
错误:语法错误
有人可以告诉我为什么我上面的代码中有错误吗?
答案 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"
#
我怀疑你正在尝试做比这更好的事情,但如果是这样的话,你需要更仔细地解释它(至少对我来说: - )。