Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 在F中用不确定数量的参数包装函数#_F#_Higher Order Functions - Fatal编程技术网

F# 在F中用不确定数量的参数包装函数#

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

我试图在F#中编写一个简单的包装器类,它接受一个返回字符串的函数,并返回一个接受相同参数的函数,并从输入“wrapped”返回字符串

以下代码适用于采用单个变量的函数(因此
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的解决方案更适合我的用例。