c# – 用功能组合推断泛型类型

c# – 用功能组合推断泛型类型,第1张

概述假设我想实现一个功能组合,如下所示: public Func<T,T> Compose<T>(Func<T,T> f, Func<T,T> g) { return new Func<T,T>( x => f(g(x))); } 现在在实践中,我可以像这样使用这个Compose()fn: public String ToUpper(String s) { return 假设我想实现一个功能组合,如下所示:
public Func<T,T> Compose<T>(Func<T,T> f,Func<T,T> g)    {        return new Func<T,T>( x => f(g(x)));    }

现在在实践中,我可以像这样使用这个Compose()fn:

public String toupper(String s) { return s.toupper(); }            public String Replicate(String s) { return s+s; }    public voID Run()    {        var h = Compose<String>(toupper,Replicate);        System.Console.Writeline("{0}",h("fred"));    }

结果是FREDFRED.

有没有办法使用更简单的语法来调用Compose?我试过这样的:

var h = Compose(toupper,Replicate);

…但是我收到编译错误:

error CS0411: The type arguments for method ‘FunctionalTest.Compose(System.Func,System.Func)’ cannot be inferred from the usage. Try specifying the type arguments explicitly.

很容易理解.我想知道是否有可能以不同方式声明它并得到推断实际工作.

编辑
问题的根源:我正在观看本科生功能编程课程的在线讲座,UC Berkley的CS61A. (在youtube上找到它).我没有关于FP的正式培训,我想我可能会学到一些东西.教授使用方案,他谈论方案lisp如何是纯函数式语言,而其他语言则不那么简单.他特别指出Pascal,C,C和Java(但不是C#)缺乏功能,并表示用这些语言进行功能组合很难(“没有站在你的头上”).他声称指向函数的指针(在C,C中可用)与函数“entity”(lambda)不同.我明白了.

有趣 – 他没有提到JavaScript或C#,我认为它们是主流语言,两者都具有相当不错的功能. (我不知道F#.)

我觉得很奇怪这是去年 – 14个月前的讲座 – 然而他似乎并不知道主流现代语言的功能方面.

所以我跟着做练习,但不是使用scheme或lisp,而是使用C#.并且还在JavaScript中执行其中一些 *** 作.

无论如何,感谢大家对质量的反应.

解决方法 以下代码可以工作:
Func<string,string> toupper = toupper;Func<string,string> replicate = Replicate;// Now the compiler kNows that the parameters are Func<string,string>var h = Compose(toupper,replicate);

所以也许你仍然可以通过仅定义这些变量一次来获得你正在寻求的可读性改进,并且他们在整个测试中重复使用它们(我假设这是一个测试实用程序…)

总结

以上是内存溢出为你收集整理的c# – 用功能组合推断泛型类型全部内容,希望文章能够帮你解决c# – 用功能组合推断泛型类型所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1239402.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存