2010-11-29 3 views
4

나는 다음과 같은 유형을 정의하기 위해 노력하고있어 :형식을 자체 형식 정의로 사용할 수 있습니까?

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

을하지만 난 오류 'LList가'정의되지 않은 얻고있다.

내가하려는 일을 할 수있는 방법이 있습니까? 즉 자신의 유형 정의에서 정의하고있는 유형을 사용하고 있습니까?

감사

답변

7

다른 사람들이 지적했듯이, LList이 유형의 이름이 아닌,

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

(. 내가 괄호를 잘인지 모르겠어요 내 ML 매우 녹슨) : 그냥 직접 관련된 유형을 사용 , 차별화 된 노동 조합의 생성자의 이름 일뿐입니다. F #에서는 차별화 된 통합의 경우가 .NET 유형으로 컴파일되지만 실제로 구현 된 세부 사항이므로 생성 된 유형을 참조 할 수 없습니다.

당신은 (재귀 유형을 선언 type .. and 사용) string 구성 캐스트 다음 LList (브라이언과 마르셀로 제안으로) 당신이 정의를 확장 할 수 있습니다로 LFunction를 선언하거나 새로운 유형을 선언하려면 다음

type List = Token list 
and Token = 
    | LInt of int 
    | LString of string 
    | LList of List 
    | LFunction of string * List 

추신 : F #을 쓰고 있다면 표준 명명 가이드 라인을 따르고 유형 이름에 대해 더 알기 쉬운 이름으로 PascalCase을 사용하는 것이 좋습니다. "l"은 무엇을 의미합니까? 그것을 확장 할 수 있습니까? (타입 유추 덕분에 타입 이름을 쓸 필요가 없습니다).

+0

나는 일반적으로 좀 더 기술적 인 이름을 사용하기를 원하지만, 나는 언어를 사용하여 ispesque 언어에 대한 간단한 인터프리터를 작성하여 놀고있다. 기본적으로, 꽤 자기가 담긴 것을 쓰면서 조금 더 나은 언어를 배우려고 노력하지만, 그다지 사소하지는 않습니다! – MrBear

+0

@MrBear : F #'List' 유형으로 콜리 전하는'List'라는 한 유형을 명명했기 때문에 저는 주로 "PS"를 썼습니다. 'LispList'를 사용하면 더 좋을 것입니다 :-) –

4

LList이 유형의 이름이 아닙니다; lToken입니다. 아마도 대신 lToken list을 원하십니까?

6

LList은 유형이 아닌 생성자입니다.

+0

괄호가 필요하다고 생각하지 않습니다. | LF 함수의 문자열 lToken 목록 잘 작동하는 것 같습니다. 저는 아직 언어를 배우는 중입니다. 다른 언어에서 알고있는 아이디어를 ML에 매핑하려고 할 때 조금 혼란 스럽습니다. 슬프게도 모든 것을 감싸는 데는 시간이 걸립니다! – MrBear

관련 문제