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

MrB*_*ear 4 f# ocaml

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

type lToken =
  LInt of int 
| LString of string 
| LList of lToken list
| LFunction of string * LList
Run Code Online (Sandbox Code Playgroud)

但我得到一个错误'LList'没有定义.

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

谢谢

Tom*_*cek 7

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

如果你想声明LFunction为包含stringa和a 的强制转换,LList那么你可以扩展定义(如Brian和Marcelo建议的那样)或声明一个新类型(type .. and用于声明递归类型):

type List = Token list 
and Token = 
  | LInt of int  
  | LString of string  
  | LList of List
  | LFunction of string * List 
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*tos 6

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

...
| LFunction of string * (lToken list)
Run Code Online (Sandbox Code Playgroud)

(我的ML很生锈;我不确定括号是否正确.)