2

以下の C# コードと同等の 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;
}
4

2 に答える 2

8

慣用的な機能リストを使用したい場合は、次のように記述できます。

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

(int64 * string) listC# の型と同じ型を取得できるように、注釈を追加しました。追加しなかった場合、F# コンパイラは関数がジェネリックであると推論します。これは、タプルの最初の 2 つの要素の型が実際には問題にならないためです。param:list<int64 * string>注釈は、読みやすいC# スタイルの表記法で記述することもできます。

.NETList型 (F# では通常は推奨されません) を使用する場合は、F# エイリアスResizeArrayを使用して次のように記述できます。

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

これにより、F# リストが作成され、.NETList<T>型に変換されます。これにより、C# バージョンとまったく同じパブリック IL 署名が得られるはずですが、F# 固有の型を使用することをお勧めします。

補足として、2 番目の例は命令型 F# コードを使用して実装できます ( forC# のように要素を反復処理するために使用します)。これは 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")
于 2012-04-30T16:28:54.067 に答える
2

直訳は次のとおりです。

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

ただし、これはあまり慣用的ではありません。

于 2012-04-30T16:32:08.350 に答える