【发布时间】: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