списки дискриминируемых союзов в fsharp - PullRequest
3 голосов
/ 06 февраля 2012

Кто-нибудь может объяснить, почему следующие 2 оператора let не работают?

 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) ]

Ожидается, что это выражение будет иметь тип Card, но здесь имеет тип 'список

и это пусть дает

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

выражение, как ожидалось, будет иметь тип Card, но здесь имеет тип 'a *' b

Ответы [ 2 ]

10 голосов
/ 06 февраля 2012

F # является типобезопасным языком. Таким образом, первое выражение неверно, поскольку Card и 'a list несовместимы. Второе выражение также неверно, потому что для вашей аннотации требуются элементы списка типа Card, но вместо этого вы указали кортежи.

Более того, (Two, Diamonds) и (Jack, Hearts) даже не разрешено использовать в одном и том же списке. Первый - это кортеж Rank * Suit, а второй - кортеж Face * Suit.

Ваше намерение - создать два значения типа Card; Вы должны предоставить соответствующие конструкторы, основанные на различных случаях объединения Card:

let c1 = RankCard (Two, Diamonds)  // c1: Card
let c2 = FaceCard (Jack, Hearts) // c2: Card

Теперь вы можете использовать c1 и c2 в том же списке deck, и средство проверки типа F # автоматически выведет deck, чтобы иметь тип Card list:

let deck = [c1; c2] // deck: Card list

Кроме того, у вас есть следующий список:

let deck = [RankCard (Two, Diamonds); FaceCard (Jack, Hearts)]
4 голосов
/ 06 февраля 2012

Вам необходимо использовать конструктор RankCard или FaceCard - иначе F # думает, что вы только что дали ему обычный список кортежей.

В качестве альтернативы, почему бы не позволить F # выводить типы самостоятельно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...