需要帮助将 Ruby 代码转换为 F#

Need help converting Ruby code into F#

我在 Ruby 中有以下代码,它采用 'melds' 的列表并创建一个树结构,以便找到融合和 returns 的最佳组合。我想将此代码转换为 F# 等效代码,但我很难想出一种方法,因为 F# 没有创建节点树的简单方法(至少我知道)。

我使用 F# 的时间不长,所以我对它没有很好的理解,也没有很多使用高阶函数的知识,所以如果有人知道如何转换这段代码,那就是非常感激!谢谢

class MeldNode
  attr_accessor :cards, :deadwood, :parent
  def initialize(cards, parent)
    @parent = parent
    @cards = cards
    @deadwood = count_deadwood(cards)
    if (parent != nil)
      @deadwood = @parent.deadwood + @deadwood
    end
  end
end

def build_meld_tree(melds, root_meld)
  best = root_meld
  melds.each do |m|
    n = MeldNode.new(m, root_meld)
    new_tree = build_meld_tree(clean_meld_group(melds, m), n)
    best = new_tree if (best == nil) || (new_tree.deadwood > best.deadwood)
  end
  best
end 

因此,准确获取您的代码并将其移植到 F#:

type MeldNode<'a> =
  { cards : 'a; deadwood : int; parent : MeldNode<'a> option }

  static member New cards (parent:MeldNode<'a> option) =
    {
      cards = cards;
      deadwood = (Array.length cards) + (if parent.IsSome then parent.Value.deadwood else 0);
      parent = parent
    }


let rec buildMeldsTree rootMeld (melds:'a[] list) =
  if List.isEmpty melds then None // ensure terminating case
  else
    melds
    |> List.map (fun m ->
      let n = MeldNode<'a>.New m rootMeld
      buildMeldsTree (Some n) (cleanMeldGroup melds m)
    )
    |> List.append (if rootMeld.IsNone then [] else [ rootMeld.Value ])
    |> List.maxBy (fun (n:MeldNode<'a>) -> n.deadwood)
    |> Some

我看到您更新了一个名为 best 的变量。 F# 更喜欢不可变变量,因此使用这种获取 "best" 组合的方式符合该偏好。希望这对您有所帮助!