fsharp中受歧视的工会名单

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)

现在你可以使用c1c2在同一个列表中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)


Mat*_*ick 5

您需要使用RankCardorFaceCard构造函数——否则 F# 认为您刚刚给了它一个普通的元组列表。

或者,为什么不让 F# 推断类型本身?