在 C# 中,我们做这样的事情:
class Program {
static Action Curry<T>(Action<T> action, T parameter) {
return () => action(parameter);
}
static void Foo(int i) {
Console.WriteLine("Value: {0}", i);
}
static void Main(string[] args) {
Action curried = Curry(Foo, 5);
curried();
}
}
方法一目了然Foo
对应你的方法Foo
,只需进行适当的调用Console.WriteLine
代替std::cout
.
接下来我们声明一个方法Curry
接受一个Action<T>
并返回一个Action
。一般来说,一个Action<T>
是一个接受单个参数类型的委托T
并返回void
。尤其,Foo
is an Action<int>
因为它接受一个类型的参数int
并返回void
。至于返回类型Curry
,它被声明为Action
. An Action
是一个委托,没有参数并且返回void
.
的定义Curry
是比较有趣的。我们使用 lambda 表达式定义一个操作,这是一种非常特殊的匿名委托形式。有效地
() => action(parameter)
说void
参数映射到action
评估于parameter
.
最后,在Main
我们正在声明一个实例Action
named curried
这就是申请的结果Curry
to Foo
与参数5
。这起到了相同的作用bind(fun_ptr(foo), 5)
在你的 C++ 示例中。
最后,我们调用新形成的委托curried
通过语法curried()
。这就像someCallback()
在你的例子中。
对此的奇特术语是currying http://en.wikipedia.org/wiki/Currying.
作为一个更有趣的示例,请考虑以下内容:
class Program {
static Func<TArg, TResult> Curry<TArg, TResult>(
Func<TArg, TArg, TResult> func,
TArg arg1
) {
return arg => func(arg1, arg);
}
static int Add(int x, int y) {
return x + y;
}
static void Main(string[] args) {
Func<int, int> addFive = Curry<int, int>(Add, 5);
Console.WriteLine(addFive(7));
}
}
这里我们声明一个方法Curry
接受委托(Func<TArg, TArg, TResult>
接受两个相同类型的参数TArg
并返回其他类型的值TResult
和一个类型的参数TArg
并返回一个接受单个参数类型的委托TArg
并返回一个类型的值TResult
(Func<TArg, TResult>
).
然后,作为测试,我们声明一个方法Add
接受两个类型的参数int
并返回一个类型的参数int
(a Func<int, int, int>
)。然后在Main
我们实例化一个名为的新委托addFive
它的作用类似于将 5 添加到其输入参数的方法。因此
Console.WriteLine(addFive(7));
prints 12
在控制台上。