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

时间:2017-04-20 13:16:55

标签: ruby f# tree structure code-conversion

我在Ruby中有以下代码,它列出了' melds'并创建一个树形结构,以找到最佳组合并返回它。我想将此代码转换为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 

1 个答案:

答案 0 :(得分:1)

因此,请准确地使用您的代码并将其移植到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的var。 F#更喜欢不可变的变量,因此使用这种获得“最佳”组合的方式符合该偏好。希望这有帮助!