当前位置:  开发笔记 > 编程语言 > 正文

适当的C#中的Currying

如何解决《适当的C#中的Currying》经验,为你挑选了1个好方法。

给定一个DoSomething采用(无参数)函数的方法并以某种方式处理它.有没有更好的方法为参数的函数创建"重载"而不是下面的代码片段?

public static TResult DoSomething(Func func)
{
    //call func() and do something else
}

public static TResult DoSomething(
    Func func,
    T0 arg0)
{
    return DoSomething(() => func(arg0));
}

public static TResult DoSomething(
    Func func,
    T0 arg0, T1 arg1)
{
    return DoSomething(arg => func(arg, arg1), arg0);
}

public static TResult DoSomething(
    Func func,
    T0 arg0, T1 arg1, T2 arg2)
{
    return DoSomething(arg => func(arg, arg1, arg2), arg0);
}

Jon Skeet.. 31

编辑:如评论中所述,这是部分应用而不是currying.我写了一篇关于我对差异的理解的博客文章,人们可能会感兴趣.

嗯,它并没有特别的不同 - 但我将currying部分与"调用DoSomething"部分区分开来:

public static Func Apply (Func func, TArg arg)
{
    return () => func(arg);
}

public static Func Apply (Func func,
                                                          TArg1 arg1, TArg2 arg2)
{
    return () => func(arg1, arg2);
}

// etc

然后:

DoSomething(Apply(foo, 1));

这样,您可以在其他情况下重用currying代码 - 包括您不想立即调用新返回的委托的情况.(例如,您可能希望稍后再讨论它.)



1> Jon Skeet..:

编辑:如评论中所述,这是部分应用而不是currying.我写了一篇关于我对差异的理解的博客文章,人们可能会感兴趣.

嗯,它并没有特别的不同 - 但我将currying部分与"调用DoSomething"部分区分开来:

public static Func Apply (Func func, TArg arg)
{
    return () => func(arg);
}

public static Func Apply (Func func,
                                                          TArg1 arg1, TArg2 arg2)
{
    return () => func(arg1, arg2);
}

// etc

然后:

DoSomething(Apply(foo, 1));

这样,您可以在其他情况下重用currying代码 - 包括您不想立即调用新返回的委托的情况.(例如,您可能希望稍后再讨论它.)

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有