我可以在自己的类型定义中使用类型吗?

时间:2010-11-29 11:05:02

标签: f# ocaml

我正在尝试定义以下类型:

type lToken =
  LInt of int 
| LString of string 
| LList of lToken list
| LFunction of string * LList

但我收到错误'LList'未定义。

有没有办法做我正在尝试做的事情 - 即使用我在自己的类型定义中定义的类型?

由于

3 个答案:

答案 0 :(得分:7)

正如其他人指出的那样,LList不是一个类型的名称,而只是一个被区分的union的构造函数的名称。在F#中,有区别的联合的情况恰好被编译为.NET类型,但这只是一个实现细节,你不能引用生成的类型。

如果您要将LFunction声明为包含stringLList的演员,那么您可以扩展定义(如Brian和Marcelo建议的那样)或声明新类型(使用type .. and声明递归类型):

type List = Token list 
and Token = 
  | LInt of int  
  | LString of string  
  | LList of List
  | LFunction of string * List 

PS:如果您正在编写F#,那么我建议遵循标准命名准则并使用PascalCase更具描述性的名称来命名类型名称。 “l”代表什么?你可以扩展它(感谢类型推断,你不需要写类型名称。)

答案 1 :(得分:6)

LList是构造函数,而不是类型。只需直接使用相关类型:

...
| LFunction of string * (lToken list)

(我的ML非常生疏;我不确定括号是否正确。)

答案 2 :(得分:4)

LList不是类型的名称; lToken是。也许你想要lToken list呢?