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