gpt4 book ai didi

f# - F#建模扑克牌

转载 作者:行者123 更新时间:2023-12-04 13:13:25 25 4
gpt4 key购买 nike

我正在尝试在F#中表示standard playing cards。我的目标是实现Microsoft Solitaire(Windows附带的副本)的克隆,该游戏中Cards的西装,面部和颜色很重要。此练习主要是为了学习一些F#而设计的。

我曾考虑使用歧视性工会:

type Suit =
| Diamonds
| Hearts
| Clubs
| Spades

type Color =
| Red
| Black

type Face =
Two | Three | Four | Five | Six | Seven |
Eight | Nine | Ten | Jack | Queen | King | Ace

卡的记录类型:
type Card = {
suit: Suit;
face: Face;
color: Color;
}

但是,可以从套装中推断出卡片的颜色-所有钻石和红心均为红色,所有棍棒和黑桃均为黑色。不能仅从“颜色”确定西装。也许这样的事情是合适的:
type Suit =
| Diamonds of Color //should always be red
| Hearts of Color //should always be red
| Clubs of Color //should always be black
| Spades of Color //should always be black

type Face =
Two | Three | Four | Five | Six | Seven |
Eight | Nine | Ten | Jack | Queen | King | Ace

type Card = {
suit: Suit;
face: Face;
}

但这似乎并不正确,因为这允许不正确的组合,例如黑心和红色黑桃。

我的问题是:
  • 考虑到颜色取决于西服,最常见的处理西服和颜色的方法是什么?
  • 是否应该明确表示“颜色”的概念?从理论上讲,可以用与钻石或红心(红色)和棍棒或黑桃(黑色)的图案匹配替换所有出现的颜色。
  • 最佳答案

    由于可以始终从Color推断出Suit,因此没有必要对其进行显式建模。您将要制作illegal states unrepresentable

    您仍然可以使用Active Pattern从模型中获得良好的编程经验,并拥有一种很好的颜色建模方法:

    type Suit =
    | Diamonds
    | Hearts
    | Clubs
    | Spades

    let (|Red|Black|) suit =
    match suit with
    | Diamonds | Hearts -> Red
    | Clubs | Spades -> Black

    这将使您可以在 Suit上进行模式匹配,例如以下inane示例:
    let printColor card =
    match card.Suit with
    | Red -> "Red"
    | Black -> "Black"

    FSI的用法示例:
    > printColor { Suit = Spades; Face = Ace };;
    val it : string = "Black"
    > printColor { Suit = Diamonds; Face = King };;
    val it : string = "Red"

    关于f# - F#建模扑克牌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29001670/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com