有没有一种更简单的方法来使用F#初始化这副牌?
let create() = [ 0..12 ]
type Suit =
| Spades of list<int>
| Hearts of list<int>
| Clubs of list<int>
| Diamonds of list<int>
let spades = create() |> Spades
let hearts = create() |> Hearts
let clubs = create() |> Clubs
let diamonds = create() |> Diamonds
Run Code Online (Sandbox Code Playgroud)
具体来说,我想简化这四种套装的初始化.有更简单的方法吗?
我可以列举这个有区别的联盟的类型并将其分配给一些"甲板"结构吗?
注意:
我是F#的新手.如果这个问题似乎无知,请原谅我.
我不认为有更简洁的方式,但我也不会模仿这样的扑克牌,因为它无助于使非法国家无法代表.举个例子,我可以这样做:
> Spades [-1; 10; 100];;
val it : Suit = Spades [-1; 10; 100]
Run Code Online (Sandbox Code Playgroud)
那有什么意思?
相反,我可能会像这样模拟卡片:
type Suit = Diamonds | Hearts | Clubs | Spades
type Face =
| Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten
| Jack | Queen | King | Ace
type Card = { Suit: Suit; Face: Face }
Run Code Online (Sandbox Code Playgroud)
这将使您能够表达任何有效的卡:
> { Suit = Spades; Face = Ace };;
val it : Card = {Suit = Spades;
Face = Ace;}
Run Code Online (Sandbox Code Playgroud)
另一方面,你不能表达invalid卡片:
> { Suit = Spades; Face = Hundred };;
{ Suit = Spades; Face = Hundred };;
------------------------^^^^^^^
stdin(4,25): error FS0039: The value or constructor 'Hundred' is not defined
Run Code Online (Sandbox Code Playgroud)
初始化在这个模型中看起来有点麻烦,但另一方面,以下deck是一个不可变的值,所以一旦定义了,你就可以一次又一次地重复使用它.
let deck = [
{ Suit = Diamonds; Face = Two };
{ Suit = Diamonds; Face = Three };
{ Suit = Diamonds; Face = Four };
{ Suit = Diamonds; Face = Five };
{ Suit = Diamonds; Face = Six };
{ Suit = Diamonds; Face = Seven };
{ Suit = Diamonds; Face = Eight };
{ Suit = Diamonds; Face = Nine };
{ Suit = Diamonds; Face = Ten };
{ Suit = Diamonds; Face = Jack };
{ Suit = Diamonds; Face = Queen };
{ Suit = Diamonds; Face = King };
{ Suit = Diamonds; Face = Ace };
{ Suit = Hearts; Face = Two };
{ Suit = Hearts; Face = Three };
{ Suit = Hearts; Face = Four };
{ Suit = Hearts; Face = Five };
{ Suit = Hearts; Face = Six };
{ Suit = Hearts; Face = Seven };
{ Suit = Hearts; Face = Eight };
{ Suit = Hearts; Face = Nine };
{ Suit = Hearts; Face = Ten };
{ Suit = Hearts; Face = Jack };
{ Suit = Hearts; Face = Queen };
{ Suit = Hearts; Face = King };
{ Suit = Hearts; Face = Ace };
{ Suit = Clubs; Face = Two };
{ Suit = Clubs; Face = Three };
{ Suit = Clubs; Face = Four };
{ Suit = Clubs; Face = Five };
{ Suit = Clubs; Face = Six };
{ Suit = Clubs; Face = Seven };
{ Suit = Clubs; Face = Eight };
{ Suit = Clubs; Face = Nine };
{ Suit = Clubs; Face = Ten };
{ Suit = Clubs; Face = Jack };
{ Suit = Clubs; Face = Queen };
{ Suit = Clubs; Face = King };
{ Suit = Clubs; Face = Ace };
{ Suit = Spades; Face = Two };
{ Suit = Spades; Face = Three };
{ Suit = Spades; Face = Four };
{ Suit = Spades; Face = Five };
{ Suit = Spades; Face = Six };
{ Suit = Spades; Face = Seven };
{ Suit = Spades; Face = Eight };
{ Suit = Spades; Face = Nine };
{ Suit = Spades; Face = Ten };
{ Suit = Spades; Face = Jack };
{ Suit = Spades; Face = Queen };
{ Suit = Spades; Face = King };
{ Suit = Spades; Face = Ace }; ]
Run Code Online (Sandbox Code Playgroud)
虽然这看起来很乏味,但你只需要写一次.由于deck是值,因此可以使其成为属于模块的值.客户可以简单地使用此值,而不必自己初始化套牌.