Могу ли я использовать тип в его собственном определении типа? - PullRequest
4 голосов
/ 29 ноября 2010

Я пытаюсь определить следующий тип:

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

но я получаю сообщение об ошибке "LList" не определен.

Есть ли способ сделать то, что я пытаюсь сделать - то есть использовать типы, которые я определяю, внутри их собственного определения типа?

Спасибо

Ответы [ 3 ]

7 голосов
/ 29 ноября 2010

Как отмечали другие, 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 с более описательным именем для имен типов.Что означает «л»?Не могли бы вы развернуть его (благодаря выводу типа, вам все равно не нужно будет писать имя типа).

6 голосов
/ 29 ноября 2010

LList это конструктор, а не тип. Просто используйте связанный тип напрямую:

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

(Мой ML очень ржавый; я не уверен, правильные ли скобки.)

4 голосов
/ 29 ноября 2010

LList не является именем типа; lToken есть. Возможно, вы хотите lToken list вместо этого?

...