如何将函数传递给函数?VB2010中是否可用functors / function objects?

8
我希望创建一个数值积分方法,该方法接收解析函数并在指定区间内进行积分。对于数值积分过程,我想要使用nr.com中的一些程序。问题是这些程序用C++编写,它们使用functor将函数传递给积分方法。在VB 2010中如何实现此目标?
我想要初始化函数(例如为y(x)=a*x+b设置a=1,b=0),然后将其传递给积分方法。然后当积分方法调用函数时,它只调用一个参数的函数(即因为a,b已经设置,所以只需要x)。
在VB2010中最佳的方法是什么?我想要创建一个通用积分方法,可以传递任何单值函数和积分限制。
到目前为止,我发现VB的工具有: - 使用委托传递函数 - 使用lambda表达式来表示函数 - 发送指针/地址 - 创建函数类/结构并将其提交给函数
目前,我最倾向于创建一个函数类。但是我不太确定应该如何操作。例如,我为每个要集成的“唯一函数”创建不同的类,但是当我需要在积分函数调用中指定参数类型时,如何将它们传递给积分函数?
这似乎是一个基本问题,适用于许多数学操作,因此我认为澄清此问题将非常有用。
2个回答

14
抱歉代码块较长,但我想展示使用Lambda表达式和匿名函数时可用的不同选项。
首先,我们将创建一些基本函数以进行演示...
'Solves a basic linear equation y(x) = ax + b, given a, b, and x.
Function Linear(a As Double, b As Double, x As Double) As Double
    Return a * x + b
End Function

'Return the inverse of a number (i.e. y(x) = -x)
Function Inverse(x As Double) As Double
    Return -x
End Function

同时也可以编写一个接受函数作为参数的函数。

'To help differentiate the type of the parameter from the return type,
'I'm being generic with the return type. This function takes any function 
'that takes a double and returns some generic type, T.
Public Function EvalEquation(Of T)(x As Double, equation As Func(Of Double, T)) As T
    Return equation(x)
End Function

最后,我们将使用它!
'The closest thing to a functor is probably the AddressOf keyword.
For x = 0 To 10
    Dim answer = EvalEquation(x, AddressOf Inverse)
    'Do something
Next

但是 AddressOf 有一些限制...... EvalEquationForX 需要一个只接受一个参数的函数,因此我不能简单地使用 AddressOf,因为我无法传递额外的参数。不过,我可以动态创建一个函数来为我执行这个操作。
For x = 0 To 10
  Dim answer = EvalEquation(x, Function(x)
                                   Dim a = 1
                                   Dim b = 0
                                   Return Linear(a, b, x)
                               End Function)
  'Do something
Next

需要注意的是,您可以定义一个 Func(Of T1, T2, T3, T4,... TResult),因此您可以创建一个可以接受两个参数并使用它的函数。

Public Function EvalEquationWithTwoParameters(Of T)(
    a As Double, b As Double, x As Double,
    equation As Func(Of Double, Double, Double, T)) As T

    Return equation(a, b, x)
End Function

并且像这样使用:

For x = 0 To 10
    Dim answer = EvalEquationWithTwoParameters(1, 0, x, AddressOf Linear)
    'Do something
Next

希望这能有所帮助!

4

看看 delegates

您应该使用您想要调用的函数的签名来定义一个代表。 "接受另一个函数"的函数应该有一个您定义的委托类型的参数。然后,您可以创建一个委托实例,通过传递实际函数的 addressof ,并通过参数将委托实例传递给函数。

以下是一个快速而简单的示例。

Public Class Test
    Public Delegate Function MyDelegate(Param1 As Integer) As Integer

    Public Function DoSomethingWithParam1(Param1 As Integer) As Integer
        Return Param1 + 1
    End Function

    Public Sub ThisFunctionTakesADelegate(f As MyDelegate)
        Dim result As Integer = f.Invoke(2)
    End Sub

    Public Sub main()
        Dim f As New MyDelegate(AddressOf DoSomethingWithParam1)

        ThisFunctionTakesADelegate(f)'pass the function "DoSomethingWithParam1" as a parameter to "ThisFunctionTakesADelegate"
    End Sub

End Class

您还应该查看Lambdas匿名函数,作为定义函数调用的另一种方法,而无需具有专用命名的函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接