0

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

以下代码适用于采用单个变量的函数(因此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是无效的代码。是否有一种语法允许这种结构?

4

2 回答 2

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# 中轻松编码。您可以使用反射来构建类似的东西(但这将是低效且不安全的),或者您可以编写一些更复杂的参数编码,但我认为元组是最好的选择。

于 2011-12-04T23:11:41.450 回答
1

你的功能有效。当你这样做时,问题出在你的最后一行

let test2 = myFunc Func3

应该

let test2 x = myFunc (Func3 x)

更新:

我假设您不想更改 Func3。否则,托马斯的解决方案可能就是您所需要的。

于 2011-12-04T23:16:23.023 回答