将列表应用于函数的参数

时间:2013-11-28 20:52:05

标签: list function f# functional-programming

如何在F#中编写一个函数,用于将值列表应用于像Apply (@@) symbol in mathematica这样的函数(将列表的元素映射到函数参数)

例如apply f [1;2;3]调用f(1,2,3)或在curried函数应用程序中f 1 2 3

1 个答案:

答案 0 :(得分:9)

你可以编写像apply这样的函数,它接受任何F#函数和一个参数数组,并通过Reflection调用函数。

然而,有一个很好的理由为什么它不在标准的F#库中 - F#的优势之一(例如与Mathematica相比)是它是静态类型语言并且可以在编译时捕获大多数潜在错误。如果您使用类似apply的内容,那么您将失去此检查[因为您永远不知道列表是否具有正确的长度]。

尽管如此,这是一个如何做到这一点的例子:

open Microsoft.FSharp.Reflection

let apply (f:obj) (args:obj[]) =
  if FSharpType.IsFunction(f.GetType()) then
    let invoke =
      f.GetType().GetMethods()
      |> Seq.find (fun mi -> mi.Name = "Invoke" && mi.GetParameters().Length = args.Length)
    invoke.Invoke(f, args)
  else failwith "Not a function"

示例使用如下所示:

let add a b = a + b;;
apply add [| 3;4 |];;