【问题标题】:F# Sequences and RecordsF# 序列和记录
【发布时间】:2017-04-30 16:44:22
【问题描述】:

我有 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}

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

只是想知道如何在实际的 int 中获得卡片的等级......到目前为止我有

let getActualValue (card:Card) =
    value |> translatedValue.Rank

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

【问题讨论】:

  • 你应该看看this

标签: f# functional-programming


【解决方案1】:

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

假设您需要排名来计算游戏中的优势。最好创建这样的函数。

let weightFromRank rank =
    match rank with
    | Ace -> 1
    | Two -> 2
    ...etc...

您可以使用function 关键字来制作此函数的简洁版本。

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

不同类型的游戏在 Ace 上的权重不同。有些游戏给 Ace 的权重为 14,比国王高一个。然后,您可以使用不同的函数来计算重量,具体取决于所玩的游戏类型。

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

【讨论】:

    【解决方案2】:

    您可以将Rank 声明为枚举:

    type Rank = 
        | Ace = 1 
        | Two = 2 
        | Three = 3 
    ....
    

    然后使用int 获取底层价值:

    let getActualValue ({rank = r}) = int r
    

    【讨论】:

      【解决方案3】:

      如果您想将整数排名与其他排名进行比较,那么您可以只比较已区分的联合值,因为比较是免费内置的:

      Eight < Nine // true
      Jack < Six // false
      
      [Seven; Ace; Four; Two] |> List.sort
      // [Ace; Two; Four; Seven]
      

      现在,如果您出于某种原因真的需要整数等级值,您可以使用反射来获取 DU 案例。只需确保您在顶级模块值内而不是在函数内执行此操作,以便在程序启动时仅进行一次反射:

      open FSharp.Reflection
      let ranks =
          FSharpType.GetUnionCases(typeof<Rank>)
          |> Array.map (fun c -> FSharpValue.MakeUnion(c, [||]) :?> Rank)
      
      let getActualValue rank = Array.findIndex ((=) rank) ranks
      
      getActualValue Ace // 0
      getActualValue Two // 1
      getActualValue King // 12
      

      【讨论】:

        猜你喜欢
        • 2011-05-01
        • 2014-05-12
        • 2011-11-27
        • 1970-01-01
        • 2021-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多