33 lines
1.4 KiB
Plaintext
33 lines
1.4 KiB
Plaintext
Module PartialApplication
|
|
Function fs(Of TSource, TResult)(f As Func(Of TSource, TResult), s As IEnumerable(Of TSource)) As IEnumerable(Of TResult)
|
|
' This is exactly what Enumerable.Select does.
|
|
Return s.Select(f)
|
|
End Function
|
|
|
|
Function f1(x As Integer) As Integer
|
|
Return x * 2
|
|
End Function
|
|
|
|
Function f2(x As Integer) As Integer
|
|
Return x * x
|
|
End Function
|
|
|
|
' The overload that takes a binary function and partially applies to its first parameter.
|
|
Function PartialApply(Of T1, T2, TResult)(f As Func(Of T1, T2, TResult), arg As T1) As Func(Of T2, TResult)
|
|
Return Function(arg2) f(arg, arg2)
|
|
End Function
|
|
|
|
Sub Main()
|
|
Dim args1 As Integer() = {0, 1, 2, 3}
|
|
Dim args2 As Integer() = {2, 4, 6, 8}
|
|
|
|
Dim fsf1 = PartialApply(Of Func(Of Integer, Integer), IEnumerable(Of Integer), IEnumerable(Of Integer))(AddressOf fs, AddressOf f1)
|
|
Dim fsf2 = PartialApply(Of Func(Of Integer, Integer), IEnumerable(Of Integer), IEnumerable(Of Integer))(AddressOf fs, AddressOf f2)
|
|
|
|
Console.WriteLine("fsf1, 0-3: " & String.Join(", ", fsf1(args1)))
|
|
Console.WriteLine("fsf1, evens: " & String.Join(", ", fsf1(args2)))
|
|
Console.WriteLine("fsf2, 0-3: " & String.Join(", ", fsf2(args1)))
|
|
Console.WriteLine("fsf2, evens: " & String.Join(", ", fsf2(args2)))
|
|
End Sub
|
|
End Module
|