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