F#序列和记录

Nic*_*ruz 2 f# functional-programming

我有2个序列......

type Suit = Spades | Clubs | Hearts | Diamonds
type Rank = Ace | Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King

type Card = { suit: Suit; rank: Rank}
Run Code Online (Sandbox Code Playgroud)

intValueCard = {rank: Rank; value: int} // translates the union into an actual int

并且只是想知道如何才能在实际的IC中获得卡的等级...到目前为止我已经有了

let getActualValue (card:Card) =
    value |> translatedValue.Rank
Run Code Online (Sandbox Code Playgroud)

但对于我的生活,我无法弄清楚如何处理一个序列,getActualValue并不起作用..

Ben*_*erg 5

我没有看到任何序列.你有套装和等级是有区别的工会,你有卡是一个记录.不确定你的意思intValueCard = {rank: Rank; value: int},getActualValue引用的translateValue没有解释.排名中的整数值将用于什么?如果您编辑和改进问题,可以获得更好的帮助.

让我们假设您想要排名以计算游戏中的优势.最好创建一个这样的函数.

let weightFromRank rank =
    match rank with
    | Ace -> 1
    | Two -> 2
    ...etc...
Run Code Online (Sandbox Code Playgroud)

您可以使用该function关键字来创建此函数的详细版本.

我认为使用枚举不是一个好主意,因为你会错过函数式编程的重要优势.Enum是.NET类型,而不是功能类型.

不同种类的游戏在Ace上有不同的权重.有些比赛让Ace的重量为14,比King高出一个.然后,您可以使用不同的功能来计算重量,具体取决于玩什么类型的游戏.

因为我不是F#的顶尖专家,所以请多加以下建议.一种不同的方法是将权重作为一个单独的字段放在记录或有区别的联合或类似的东西中.我认为这种方法效率较低,因为权重来自排名,因此您可以在不需要的地方有效地复制信息,从而使您的代码更难以理解.处理不同类型游戏的不同权重也会降低效率.