F# 在F中用不确定数量的参数包装函数#
我试图在F#中编写一个简单的包装器类,它接受一个返回字符串的函数,并返回一个接受相同参数的函数,并从输入“wrapped”返回字符串 以下代码适用于采用单个变量的函数(因此F# 在F中用不确定数量的参数包装函数#,f#,higher-order-functions,F#,Higher Order Functions,我试图在F#中编写一个简单的包装器类,它接受一个返回字符串的函数,并返回一个接受相同参数的函数,并从输入“wrapped”返回字符串 以下代码适用于采用单个变量的函数(因此test工作正常): 但是因为funx->指定了一个参数,test2不是有效的代码。是否有一种语法允许这种构造?最简单的解决方案是将Func3编写为一个接受元组的函数。这样,函数将只接受一个参数,但您可以传递两个数字: // Function takeing a single argument, which is a tupl
test
工作正常):
但是因为
funx->
指定了一个参数,test2
不是有效的代码。是否有一种语法允许这种构造?最简单的解决方案是将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#编码。您可以使用反射来构建类似的东西(但这将是低效和不安全的),或者您可以编写一些更复杂的参数编码,但我认为tuple是最好的选择。最简单的解决方案是将
Func3
编写为接受一个tuple的函数。这样,函数将只接受一个参数,但您可以传递两个数字:
// 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#编码。您可以使用反射来构建类似的东西(但这将是低效和不安全的),或者您可以编写一些更复杂的参数编码,但我认为tuple是最好的选择。您的函数可以工作。
问题出在你的最后一行
let test2 = myFunc Func3
应该是
let test2 x = myFunc (Func3 x)
更新:
我假设你不想改变功能3。否则,Tomas的解决方案可能就是您所需要的。您的功能正常。
问题出在你的最后一行
let test2 = myFunc Func3
应该是
let test2 x = myFunc (Func3 x)
更新:
我假设你不想改变功能3。否则,Tomas的解决方案可能就是您所需要的。这也会起作用,但它的作用与包装只包含单个参数(或元组)的函数时略有不同。在您的版本中,每次调用
test2
时都会执行myFunc
函数,而在单参数版本中,myFunc
函数只会被调用一次。在这种情况下,这并不重要,但是如果myFunc
确实做了一些事情,那么这可能是一个问题-也就是说,如果myFunc
使用了一些内部可变状态,那么它可能效率低下或者可能不起作用。当然,这取决于您的假设。我没有完整的源代码,所以我假设你不能更改Func3。我会在心里记住这个警告myFunc
将是一个相当轻量级的纯函数;对我来说,性能上的影响并不是一个问题,而是能够轻松地处理由myFunc
返回的函数,因此Gustavo的解决方案更适合我的用例。这也会起作用,但它与包装只需要一个参数(或元组)的函数时有点不同。在您的版本中,每次调用test2
时都会执行myFunc
函数,而在单参数版本中,myFunc
函数只会被调用一次。在这种情况下,这并不重要,但是如果myFunc
确实做了一些事情,那么这可能是一个问题-也就是说,如果myFunc
使用了一些内部可变状态,那么它可能效率低下或者可能不起作用。当然,这取决于您的假设。我没有完整的源代码,所以我假设你不能更改Func3。我会在心里记住这个警告myFunc
将是一个相当轻量级的纯函数;对我来说,性能上的影响并不是什么问题,而是能够轻松地处理由myFunc
返回的函数,因此Gustavo的解决方案更适合我的用例。