2010-11-29 2 views
4

Я пытаюсь определить следующий тип:Могу ли я использовать тип в определении собственного типа?

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

, но я получаю сообщение об ошибке «LLIST» не определен.

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

Благодаря

ответ

7

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

+0

Я бы обычно пошел на более описательные имена, но я просто играю на языке, написав простой интерпретатор для lispesque языка. В принципе, пытаясь немного усвоить язык, написав то, что довольно самодостаточно, но не совсем тривиально! – MrBear 2010-11-29 13:16:12

4

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

6

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

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

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

+0

Я не думаю, что вам нужны круглые скобки - | LFunction строки lToken list , похоже, работает просто отлично. Я все еще участвую в изучении языка, и я думаю, что немного запутываю себя, когда пытаюсь сопоставить идеи, которые я знаю с других языков, на ML. К сожалению, требуется время, чтобы обернуть вокруг вас все вокруг! – MrBear 2010-11-29 13:17:53

Смежные вопросы