在F#中包含具有不确定数量的参数的函数

时间:2011-12-04 22:53:52

标签: f# higher-order-functions

我正在尝试在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不是有效代码。是否有一段语法允许这个构造?

2 个答案:

答案 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的解决方案可能就是您所需要的。