如何在 F# 中编写函数以将值列表应用于函数,例如 Apply
(@@) symbol in mathematica (将列表的元素映射到函数参数)
例如 apply f [1;2;3]
电话f(1,2,3)
或在 curry 函数应用程序中 f 1 2 3
最佳答案
你可以写一个类似 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 |];;
关于list - 将列表应用于函数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20274556/