【问题标题】:Need help converting Ruby code into F#需要帮助将 Ruby 代码转换为 F#
【发布时间】:2017-04-20 13:16:55
【问题描述】:

我在 Ruby 中有以下代码,它采用一个“融合”列表并创建一个树结构,以便找到融合的最佳组合并返回它。我想将此代码转换为 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# 具有递归功能,因此我在该代码中看不到任何不“简单”的内容。
  • 我不明白您所说的“F# 没有创建节点树的简单方法”是什么意思。 F♯ 是一种功能齐全的命令式不纯 OO 语言(即使这不是使用它的首选方式),因此您可以做与 Ruby 中相同的事情。另外,F♯ 有代数和类型(在 F♯ 中称为 Discriminated Unions)对于表示树来说是完美的,事实上,这可能是最广泛使用的示例之一用于激励代数数据类型:type Tree<'a> = Leaf of 'a | Node of Tree<'a> * Tree<'a>。 [注:我其实不太懂F♯,可能有语法错误。]
  • 我对 F# 一无所知,但一些快速的 Google 建议存在 Ruby -> C# 和 C# -> F# 翻译器,所以也许你可以分两步完成。

标签: ruby f# tree structure code-conversion


【解决方案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 的变量。 F# 更喜欢不可变变量,因此使用这种获得“最佳”组合的方式可以满足这种偏好。希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多