2012-04-30 6 views
2

以下のC#コードと同等のF#メソッドを書く方法は?グーグルにしようとしましたが、動作するものは見つかりませんでした。ありがとう。あなたは慣用的な機能のリストを使用したい場合はタプルのリストをパラメータとしてf#メソッドを宣言するには?

public List<Tuple<long, string, string>> Fun(List<Tuple<long, string>> param) 
{ 
    var ret = new List<Tuple<long, string, string>>(); 

    foreach (var tuple in param) 
    { 
    ret.Add(new Tuple<long, string, string>(tuple.Item1, tuple.Item2, "new val")); 
    } 

    return ret; 
} 

答えて

6

、あなたが書くことができます:

let func (param:(int64 * string) list) = 
    [ for n, s in param -> n, s, "new val" ] 

は、私はあなたがC#で1と同じタイプを取得することを確認するために注釈(int64 * string) listを追加しました。それを追加しなかった場合、F#コンパイラはその関数を汎用であると推論します。なぜなら、実際にはタプルの最初の2つの要素の型が何であるかは問題ではないからです。注釈は、読みやすくなるかもしれないparam:list<int64 * string>を使用してC#形式の表記法で記述することもできます。

あなたは(通常はF#で推奨されていない).NET Listタイプを使用したい場合は、F#のエイリアスResizeArrayを使用して書き込むことができます。

let func (param:(int64 * string) ResizeArray) = 
    ResizeArray [ for n, s in param -> n, s, "new val" ] 

これは、F#のリストを作成し、それを変換し、 .NET List<T>タイプ。これにより、C#バージョンとまったく同じパブリックILシグネチャが得られるはずですが、F#固有の型の使用をお勧めします。

2番目の例は、命令番号F#を使用して実装できます(forを使用してC#のような要素を繰り返し処理します)。これはC#とまったく同じILを生成しますが、後でF#コードを最適化する必要がある場合には、これは主に有効です。だから私は(それが:-)も長いです)このバージョンをお勧めしません:

let func (param:(int64 * string) ResizeArray) = 
    let res = new ResizeArray<_>() 
    for n, s in param do 
    res.Add(n, s, "new val") 
    res 

あなたはまた、List.mapのような高階関数を使用して書くことができます:ここで

let func (param:(int64 * string) list) = 
    params |> List.map (fun (n, s) -> n, s, "new val") 
2

は直訳です。

member __.Fun (param:ResizeArray<int64 * string>) = 
    ResizeArray(param |> Seq.map (fun (a, b) -> a, b, "new val")) 

これはあまり慣用的ではありませんが、

関連する問題