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) list以确保您获得与 C# 中相同的类型。如果您没有添加它,那么 F# 编译器会推断该函数是通用的 - 因为实际上元组的前两个元素的类型是什么并不重要。注释也可以用 C# 样式表示法编写,使用param:list<int64 * string>它可能更容易阅读。

如果您想使用 .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# 特定类型。

作为旁注,第二个示例可以使用命令式 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")
于 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 回答