我在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
答案 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#更喜欢不可变的变量,因此使用这种获得“最佳”组合的方式符合该偏好。希望这有帮助!