2011-10-12 39 views
6

Tôi muốn thực hiện một phương pháp tích phân số với chức năng phân tích và tích hợp nó trong một khoảng thời gian cụ thể. Đối với quy trình tích hợp số, tôi muốn sử dụng một số quy trình trong nr.com. Vấn đề là chúng được lập trình trong C++ và chúng sử dụng functors để truyền một hàm vào phương thức tích hợp. Làm thế nào tôi có thể làm điều này trong VB 2010?Làm thế nào để chuyển một hàm vào một hàm? hàm functors/function avaiable trong VB2010 là gì?

Tôi muốn khởi tạo hàm (tức là đặt = 1, b = 0 cho hàm y (x) = a * x + b) và sau đó chuyển hàm vào phương thức tích hợp. Sau đó, khi phương thức tích hợp gọi hàm, nó chỉ gọi hàm với một tham số (tức là x vì a, b đã được đặt)

Cách tốt nhất để làm điều này trong VB2010 là gì? Tôi muốn thực hiện một phương pháp tích hợp chung, nơi tôi có thể vượt qua bất kỳ giới hạn chức năng và giới hạn tích hợp duy nhất nào.

Tôi vừa bắt đầu sử dụng VB, và từ những gì tôi đã tìm thấy cho đến nay nó có vẻ như các công cụ bạn có là - cho chúng ta một đại biểu cho hàm - sử dụng một biểu thức lambda cho hàm - gửi con trỏ/adressOf - để tạo lớp/cấu trúc hàm và gửi hàm này tới hàm

Hiện tại, tôi có khuynh hướng tạo lớp chức năng nhất. Nhưng tôi không thực sự chắc chắn như thế nào. F.ex. Tôi tạo các lớp khác nhau cho mỗi "hàm uniqe" Tôi muốn tích hợp, nhưng làm thế nào tôi có thể chuyển chúng vào hàm tích hợp khi tôi cần xác định kiểu đối số trong hàm gọi-tích hợp?

Điều này có vẻ giống như một vấn đề cơ bản áp dụng cho nhiều phép toán, vì vậy tôi nghĩ sẽ hữu ích khi làm rõ điều này.

Trả lời

3

Kiểm tra delegates.

Bạn nên xác định đại biểu có chữ ký của hàm bạn muốn gọi. Hàm "có chức năng khác" phải có tham số của loại đại biểu bạn đã xác định. Sau đó, bạn có thể tạo một thể hiện của đại biểu, chuyển addressof chức năng thực tế và chuyển thể hiện ủy nhiệm vào hàm thông qua tham số.

Ví dụ nhanh và bẩn.

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 

Bạn cũng nên kiểm tra Lambdas hoặc Anonymous functions như một cách thay thế các quy định chức năng gọi mà không cần phải là một hàm có tên dành riêng.

9

Xin lỗi vì các đoạn mã dài hơn, nhưng tôi muốn minh họa các tùy chọn khác nhau có sẵn cho bạn với lambdas và các chức năng ẩn danh.

Đầu tiên chúng ta sẽ tạo một số chức năng cơ bản để chơi với ...

'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 

Và một chức năng mà phải mất một chức năng.

'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 

Và cuối cùng, chúng tôi sẽ sử dụng nó!

'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 

Nhưng AddressOf có một số hạn chế ... EvalEquationForX mong đợi một hàm chỉ mất một tham số, do đó tôi không thể đơn giản sử dụng AddressOf, vì tôi không thể chuyển các tham số phụ. Tuy nhiên, tôi có thể tự động tạo ra một chức năng có thể làm điều đó cho tôi.

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 

Tôi cần lưu ý rằng bạn có thể xác định Func(Of T1, T2, T3, T4,... TResult), để bạn có thể tạo một hàm có thể lấy hai thông số và sử dụng thay thế.

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 

Và sử dụng nó như thế này:

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

Hy vọng rằng sẽ giúp!

Các vấn đề liên quan