use*_*753 3 f# discriminated-union
任何人都可以解释为什么以下2个语句不起作用?
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) ]
Run Code Online (Sandbox Code Playgroud)
该表达式预计具有类型卡,但这里有类型'列表
这让我们给出了
let deck : Card list = [ (Two, Diamonds); (Jack, Hearts) ]
Run Code Online (Sandbox Code Playgroud)
表达式预计有类型卡,但这里有类型'a*'b
pad*_*pad 10
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
Run Code Online (Sandbox Code Playgroud)
现在你可以使用c1和c2在同一个列表中deck,并且F#类型检查器将自动推断出deck具有以下类型Card list:
let deck = [c1; c2] // deck: Card list
Run Code Online (Sandbox Code Playgroud)
或者,您有一个列表如下:
let deck = [RankCard (Two, Diamonds); FaceCard (Jack, Hearts)]
Run Code Online (Sandbox Code Playgroud)