需要帮助将 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" 组合的方式符合该偏好。希望这对您有所帮助!
我在 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" 组合的方式符合该偏好。希望这对您有所帮助!