【问题标题】:applying a list to a function's arguments将列表应用于函数的参数
【发布时间】:2013-12-14 23:44:03
【问题描述】:

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

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

【问题讨论】:

  • 我认为这在一般情况下是不可能的,因为您创建了一个不允许的无限类型。但是,如果知道列表的大小,这是微不足道的。
  • 这是一个 XY 问题。而不是描述您要解决的问题,而是描述了特定于另一个工具(Mathematica)的解决方案。如果您给出了一个问题示例,您可能会在 Mathematica 中使用 Apply 解决问题,您会在这里得到更好的答案。

标签: list function f# functional-programming


【解决方案1】:

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

然而,标准 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 |];;

【讨论】:

    猜你喜欢
    • 2018-12-19
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 2022-12-10
    相关资源
    最近更新 更多