5

我认为我可以通过引用来做到这一点 - 但我不知道如何。

我应该只使用带有名称的函数表 - 还是他们这样做的一种方式?

谢谢。

欲了解更多信息......

我从 excel 中调用了很多 f# 函数,我想知道我是否可以编写 af# 函数

let fs_wrapper (f_name:string) (f_params:list double) = 这个位用 f_params 调用 fname

然后使用

=fs_wrapper("my_func", 3.14, 2.71)

在工作表中,而不是单独包装所有功能。

4

3 回答 3

10

您需要使用标准的 .NET Reflection 来执行此操作。引用不会有帮助,因为它们表示使用标准 .NET 的函数调用MethodInfo,所以无论如何您都需要使用反射。引用的唯一好处(与天真的反射相比)是您可以编译它们,这可以为您提供更好的性能(但编译并不完美)。

根据您的具体情况(例如函数的位置),您必须执行以下操作:

module Functions =
  let sin x = sin(x)
  let sqrt y = sqrt(y)

open System.Reflection

let moduleInfo = 
  Assembly.GetExecutingAssembly().GetTypes()
  |> Seq.find (fun t -> t.Name = "Functions")

let name = "sin"
moduleInfo.GetMethod(name).Invoke(null, [| box 3.1415 |])

除非您需要一些可扩展性或具有大量函数,否则使用包含字符串作为键和函数值作为值的字典可能是一个更简单的选择:

let funcs = 
  dict [ "sin", Functions.sin;
         "sqrt", Functions.sqrt ]

funcs.[name](3.1415)
于 2011-06-03T22:30:24.743 回答
2

有很多方法,但一种方法是使用反射,例如:

typeof<int>.GetMethod("ToString", System.Type.EmptyTypes).Invoke(1, null)
typeof<int>.GetMethod("Parse", [|typeof<string>|]).Invoke(null, [|"112"|])

GetMethod 可选地采用定义签名的类型数组,但如果您的方法是明确的,则可以跳过它。

于 2011-06-03T22:30:52.733 回答
1

跟进 Thomas 所暗示的内容,看看Matthew Podwysocki 的Using and Abusing the F# Dynamic Lookup Operator。它提供了一种在 F# 中进行动态查找的语法简洁的方法。

于 2011-06-06T15:07:47.683 回答