我正在尝试定义以下类型:
type lToken =
LInt of int
| LString of string
| LList of lToken list
| LFunction of string * LList
但我收到错误'LList'未定义。
有没有办法做我正在尝试做的事情 - 即使用我在自己的类型定义中定义的类型?
由于
答案 0 :(得分:7)
正如其他人指出的那样,LList
不是一个类型的名称,而只是一个被区分的union的构造函数的名称。在F#中,有区别的联合的情况恰好被编译为.NET类型,但这只是一个实现细节,你不能引用生成的类型。
如果您要将LFunction
声明为包含string
和LList
的演员,那么您可以扩展定义(如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
呢?