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