Как другие отметили, LList
не является именем типа , а просто имя конструктора дискриминационного союза. В F # случаи дискриминированного объединения должны быть скомпилированы как типы .NET, но это всего лишь деталь реализации, и вы не можете ссылаться на сгенерированные типы.
Если вы хотите объявить LFunction
в гипсе, который состоит из string
и LList
, то вы можете либо расширить определение (как Брайан и Марсело предложить) или объявить новый тип (используя 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»? Не могли бы вы его расширить (благодаря типу вывода, вам не нужно будет писать имя типа в любом случае).
Я бы обычно пошел на более описательные имена, но я просто играю на языке, написав простой интерпретатор для lispesque языка. В принципе, пытаясь немного усвоить язык, написав то, что довольно самодостаточно, но не совсем тривиально! – MrBear 2010-11-29 13:16:12