如何将函数传递给函数?是VB 2010中可用的仿函数/函数对象吗?

时间:2011-10-12 15:47:35

标签: vb.net functor

我想制作一个数值积分方法,其中包含分析函数并将其整合到特定的时间间隔内。对于数值积分过程,我想在nr.com中使用一些过程。问题是它们是用C ++编程的,它们使用函子将函数传递给集成方法。我怎么能在VB 2010中做到这一点?

我想初始化函数(即为函数y(x)= a * x + b设置a = 1,b = 0)然后将函数传递给积分方法。然后当积分方法调用函数时,它只用一个参数调用函数(即x,因为a,b已经设置)

在VB2010中执行此操作的最佳方法是什么? 我想制作一个通用的集成方法,我可以传递任何单值函数和积分限制。

我刚开始使用VB,到目前为止,我发现它似乎是你拥有的工具 - 给我们一个功能的代表 - 为函数使用lambda表达式 - 发送指针/地址 - 创建一个函数类/结构并将其提交给函数

至于现在,我最倾向于创建一个功能类。但我不确定如何。 F.ex.我为每个想要集成的“uniqe函数”创建不同的类,但是当我需要在integration-function-call中指定参数类型时,如何将它们传递给集成函数?

这似乎是一个适用于许多数学运算的基本问题,因此我认为澄清这一点非常有用。

2 个答案:

答案 0 :(得分:11)

很抱歉代码块较长,但我想展示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

希望有所帮助!

答案 1 :(得分: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

您还应该检查LambdasAnonymous functions作为定义函数调用的替代方法,而无需专用的命名函数。