如何用元组列表作为参数声明一个f#方法?

时间:2012-04-30 16:24:17

标签: 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;
}

2 个答案:

答案 0 :(得分:6)

如果您想使用惯用功能列表,那么您可以写:

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#版本完全相同的公共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")

答案 1 :(得分:2)

以下是字面翻译:

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

然而,这并不是非常惯用的。