我正在尝试定义以下类型:
type lToken =
LInt of int
| LString of string
| LList of lToken list
| LFunction of string * LList
Run Code Online (Sandbox Code Playgroud)
但我得到一个错误'LList'没有定义.
有没有办法做我正在尝试做的事情 - 即使用我在自己的类型定义中定义的类型?
谢谢
正如其他人所指出的,LList
它不是一个类型的名称,而只是一个被区分的union的构造函数的名称.在F#中,有区别联合的情况恰好被编译为.NET类型,但这只是一个实现细节,你不能引用生成的类型.
如果你想声明LFunction
为包含string
a和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"代表什么?你可以扩展它(感谢类型推断,你不需要写类型名称).
LList
是构造函数,而不是类型.只需直接使用相关类型:
...
| LFunction of string * (lToken list)
Run Code Online (Sandbox Code Playgroud)
(我的ML很生锈;我不确定括号是否正确.)