2011-02-13 10 views
3

F #에서 스캐너를 만들었습니다. 현재 타입 (Token, string)을 가진 튜플들의 묶음의 목록을 반환합니다.F #에서 다른 형식을 반환하는 함수를 어떻게 만들 수 있습니까?

이상형으로 다른 유형을 포함 할 수있는 튜플 목록을 반환하고 싶습니다. 예를 들어 :

(Token, string) 
//if it's an identifier 

(Token, float) 
//if it's a float. 

(Token, int) 
//etc 

그래서, 기본적으로 내가 형 (Token, _)을 반환하고 싶지만 나는이를 지정하는 방법을 모르겠어요. 지금은 일치하지 않는 유형에 대해 불만이 있습니다. 나는 내 책과 위키 책을보고있다. 그러나 나는 이것이 무엇이라고 불리는지는 정말로 모른다.

정말 불가능한 경우 나중에 유형을 변환 할 수 있다고 생각하지만이 방법으로 물건을 반환 할 수 있기를 바랍니다.

+1

함수에 대한 샘플 입력과 원하는 출력을 표시 할 수 있습니까? – Juliet

답변

12

F #에서 이것을 처리하는 비교적 쉬운 두 가지 방법이 있습니다.

type Expression = 
| Identifier of string 
| FloatValue of float 
| IntValue of int 
| ... 

후는 (Token * Expression) list을 반환하도록 함수를 정의 : 하나는 차별 노동 조합을 생성하는 것입니다. 다른 가능성은 객체에 모든 것을 넣은 다음 (Token * obj) list을 반환하는 것입니다. 이것은 목록의 제작자에게는 약간 쉬우나 소비자에게는 훨씬 더 성가시다.

+0

알겠습니다. 구문 질문입니다. 나는이 일을 시도 : return (Token * Expression) functionName = .... 및 (토큰 * 표현식) functionName = .... 반환 유형을 지정하려고하지만 둘 모두에 대해 불평합니다. 여기에 리턴 타입을 지정하려고합니다. – jeff

+0

@jeff : F #에서는 let let : type = ...을 사용하여 let-bound 표현식에 유형을 지정합니다. 귀하의 경우 이것은'let functionName : string -> Token * Expression = fun input -> ...'또는'let functionName (input : string) : Token * Expression = ...'과 유사 할 것입니다. 그러나 대부분의 경우 F #이 유형을 추론 할 수 있으므로 선언 할 필요가 없습니다. FUNCTIONNAME하자 (TXT : : 문자열) : 토큰 * 표현식 = ... 코드 ... (, ) VS2010에서 , 그것은 문자열을 강조하고 "이 말한다 – kvb

+0

좋아, 그래서 난이 비슷한 시도 표현식 유형이 예상되었지만 여기에 유형 문자열이 있습니다. " 원본 응답에 표현식의 정의에 문자열이 포함되어 있습니다. 표현식 = ... | strVal of – jeff

4

kvb가 제안한 바와 같이 차별화 된 조합을 사용하는 것이 좋습니다.

다음
type Token = 
// Some toknes with no additional information 
| LParen | RParen | Begin | End 
// Some tokens with additional values 
| Identifier of string 
| IntValue of int 
| ... 

완전히에 대한 필요성을 제거 : F #으로 스캐너를 작성할 때 그냥 몇 가지 정보를 추가하기 위해,이 같은 추가 정보를 수행 할 수있다 토큰의 다양한 유형을 나열 토큰 유형 Token을 정의하는 것이 일반적이다 토큰과 별도로 값을 표시하면 Token list으로 작업 할 수 있습니다.

1

이전 답변에 추가하여 Choice 유형 (Choice1of3 등의 선택 사례)을 살펴보십시오.

관련 문제