2017-04-20 5 views
3

Rubyには、「melds」のリストを取り、ツリー構造を作成して最適な組み合わせを見つけることができます。私はこのコードをF#に相当するものに変換したいと思っていますが、F#が(少なくとも私が知っている限り)ノードのツリーを作成する簡単な方法を持っていないので、見ている方法を考えるのは苦労しています。Rubyコードを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 
+3

何を試しましたか? F#は再帰を持っているので、そのコードでは「シンプル」でないものは何も表示されません。 – ildjarn

+3

「F#はノードのツリーを作成する簡単な方法がありません」という意味を理解していません。 F♯は完全な機能を備えた必須の不完全なOO言語です(たとえそれが好きな使い方ではない場合でも)。そうすれば、Rubyで行ったのと同じことができます。さらに、F♯には、木を表現するための完全な*である代数和型(F♯の* Discriminated Unions *と呼ばれます)があります。これはおそらく代数データ型を動機付けするために最も広く使われている例の1つです: 'type tree <'a> = 'aの葉|ツリーのノード<'a> *ツリー<'a> '。 [注:私は実際にはF#をよく知らないが、構文エラーがあるかもしれない。] –

+1

F#については何も知らないが、Ruby - > C#とC# - > F#の翻訳者が存在する多分あなたは2つのステップでそれを行うことができます。 –

答えて

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#は不変の変数を優先します。したがって、この「最良の」組み合わせを得るこの方法を使用すると、その優先順位が満たされます。お役に立てれば!

関連する問題