如何将元组列表声明为 F# 方法作为参数

本文关键字:方法 参数 声明 元组 列表 | 更新日期: 2023-09-27 18:32:47

如何编写与以下 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;
}

如何将元组列表声明为 F# 方法作为参数

如果你想使用惯用的函数列表,那么你可以写:

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>

如果要使用 .NET List类型(在 F# 中通常不建议这样做(,可以使用 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# 特定类型。

作为旁注,第二个示例可以使用命令性 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 和 write:

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

这是一个直译:

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

然而,这并不是很惯用的。