c# - 如何声明一个以元组列表作为参数的 f# 方法?

标签 c# f# tuples c#-to-f#

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

最佳答案

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

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

我添加了注释 (int64 * string) list以确保您获得与 C# 中的类型相同的类型。如果您没有添加它,那么 F# 编译器会将该函数推断为泛型 - 因为元组的前两个元素的类型实际上无关紧要。注释也可以使用 param:list<int64 * string> 以 C# 样式表示法编写这可能更容易阅读。

如果您想使用 .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# 版本完全相同的公共(public) 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")

关于c# - 如何声明一个以元组列表作为参数的 f# 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10387056/

相关文章:

C# ArrayList 调用构造函数类

C# Tweetinvi 库 - 如何停止流

F# 管道占位符?

c++ - 如何从元组 C++ 中过滤重复类型

python - 如何替换元组列表中的某些字符

c# - 这是使用 Xamarin Forms 和 SQLite 建立数据库连接的完美方式吗?

javascript - 缺少参数名称 :adi

f# - F# 中 Bigint 的平方根

f# - 如何定义和使用具有不可推断类型参数的事件模式?

list - 删除列表中的重复对