2012-02-06 5 views
3

다음의 두 문장을 사용하면 왜 작동하지 않는지 설명 할 수 있습니까?fsharp에서 차별화 된 노동 조합 목록

이 표현은 유형의 카드를 것으로 예상하지만, 여기에 입력 한 '목록

을이하자가 입력 한 여기 형 카드를 것으로 예상했다

let deck : Card list = [ (Two, Diamonds); (Jack, Hearts) ] 

표현을 제공하지만,'이이었다

type Rank = 
| Two 
| Three 
| Four 
| Five 
| Six 
| Seven 
| Eight 
| Nine 
| Ten 

type Face = 
| Jack 
| Queen 
| King 
| Ace 

type Suit = 
| Diamonds 
| Clubs 
| Hearts 
| Spades 

type Card = 
| RankCard of Rank * Suit 
| FaceCard of Face * Suit 


let deck : Card = [ (Two, Diamonds); (Jack, Hearts) ] 

* 'b

답변

4

RankCard 또는 FaceCard 생성자를 사용해야합니다. 그렇지 않으면 F #에서 방금 튜플의 일반 목록을 제공했다고 생각합니다.

또는 F #이 유형 자체를 유추하지 않도록하십시오.

+0

나는 보통 타입 유추 작업 자체를 먼저 시도하고 필요할 경우에만 타입 주석을 추가하려고합니다. –

10

F #은 형식 안전 언어입니다. 따라서 Card'a list은 호환되지 않기 때문에 첫 번째 표현식이 잘못되었습니다. 두 번째 표현식은 주석에 Card 유형의 목록 요소가 필요하지만 대신 튜플을 제공했기 때문에 올바르지 않습니다.

더욱이 (Two, Diamonds)(Jack, Hearts)은 같은 목록에서 사용하기에 적합하지 않습니다. 전자는 Rank * Suit의 튜플이고 후자는 Face * Suit의 튜플입니다.

귀하의 의도는 Card의 두 가지 값을 생성합니다. 자동 Card list의 유형을 가지고 deck을 추론 할

let c1 = RankCard (Two, Diamonds) // c1: Card 
let c2 = FaceCard (Jack, Hearts) // c2: Card 
같은 목록 deckc1c2을 사용할 수 있습니다 지금

및 F # 유형 검사 : 당신은 Card의 서로 다른 조합의 경우에 따라 적절한 생성자를 제공해야

다음과 같이
let deck = [c1; c2] // deck: Card list 

또는, 당신은 목록을 가지고 :

let deck = [RankCard (Two, Diamonds); FaceCard (Jack, Hearts)] 
관련 문제