我正在尝试在F#中编写一个简单的包装类,它接受一个返回字符串的函数,并返回一个带有相同参数的函数,并从输入'wrapped'返回字符串。
以下代码适用于采用单个变量的函数(因此test
工作正常):
open System
let myFunc anotherFunc =
fun x -> "boo" + anotherFunc x + "unboo"
let Func2 toDouble =
(toDouble * 2).ToString ()
let test = myFunc Func2
let Func3 numOne numTwo =
(numOne * numTwo).ToString ()
let test2 = myFunc Func3
do
Console.WriteLine(test 10)
Console.WriteLine(test2 5 10)
但由于fun x ->
指定了单个参数,因此test2
不是有效代码。是否有一段语法允许这个构造?
答案 0 :(得分:2)
最简单的解决方案是将Func3
写为带元组的函数。这样,该函数只需要一个参数,但您可以传递两个数字:
// Function takeing a single argument, which is a tuple
let Func3 (numOne, numTwo) =
(numOne * numTwo).ToString ()
let test2 = myFunc Func3
// The created function takes a tuple as well
Console.WriteLine(test2(5, 10))
通常,没有好的方法来编写一个接受任意数量参数的函数的高阶函数。这种通用性不容易在F#中编码。您可以使用Reflection来构建类似的东西(但这样效率低且不安全),或者您可以编写一些更复杂的参数编码,但我认为元组是最佳选择。
答案 1 :(得分:1)
你的功能有效。 当你做
时,问题出在你的最后一行let test2 = myFunc Func3
应该是
let test2 x = myFunc (Func3 x)
更新:
我假设您不想更改Func3。否则Tomas的解决方案可能就是您所需要的。