C# 的函数编程 已翻译 100%

oschina 投递于 2012/12/26 15:04 (共 83 段, 翻译完成于 02-27)
阅读 7616
收藏 16
C#
9
加载中

目录

  1. 介绍
  2. 函数作为值
    1. 函数类型
    2. 函数值
    3. 函数、委托算术
  3. C# 函数编程
    1. 使用 LINQ
    2. 高阶函数
    3. 匿名函数
    4. 元祖Tuples
    5. 闭包
    6. 递归
    7. Partial 函数
    8. Curry 函数
  4. 结论
  5. 历史
红薯
翻译于 2012/12/26 15:18
4

介绍

函数式编程是一种编程范式,经常与C#面向对象编程相结合。 C#允许你使用命令式编程,面向对象的概念,但你也可以使用声明式编程。声明式编程使用的是一个更具描述性的方式来定义你想要做什么,而不是你想怎么做一些动作。例如,假设你想找到排名前10位的图书价格低于20有序的标题。在函数式编程中,您将定义是这样的:

books.Where(price<20).OrderBy(title).Take(10);

在此,你指定了price低于20的书,结果按title进行排序,并且只获取前10条记录。

l
翻译于 2012/12/26 15:33
2

现在你会说:“好吧,但是这只是简单的C#LINQ - 为什么我们要称之为函数式编程”? LINQ仅仅是一个允许您使用函数式编程概念的库。然而,函数式编程还有更多的内涵,在这篇文章中,你可能会发现一些有趣的技巧。

注意到在其他编程语言中对函数式编程的支持会更好。F#可能就是一个对函数式编程支持得更好的例子。但是,如果你不想学习一种新语言,在这儿你就可以找到C#中所提供的函数式编程的。

random_walk
翻译于 2012/12/26 16:20
1

函数作为值

函数式编程的基础思想就是函数。在函数式编程中我们需要建立其他对象的函数,对它们进行操作,并将它们传递给其他函数等等。因此,我们需要更多的自由,因为函数不仅是类的一部分,它们也是独立的对象。在C#中,你可以使用一个函数对象作为其他任何对象种类。在接下来的章节中,你可以看到我们是如何定义函数种类,给函数赋值(引用)和建立复杂的函数。

暴走游侠
翻译于 2012/12/26 15:41
2

函数类型

函数对象必须是某种委托类型. 在C#中,我们可以定义强类型的委托类型或泛型的委托类型,委托可以代表跟这个委托类型有相同参数的方法(静态方法,类方法)的引用. 定义一个委托类型的例子如下:

delegate double MyFunction(double x); 
wangking873
翻译于 2012/12/27 10:44
1
delegate double MyFunction ( double x); 看下这句(见上一段),声明了一个 delegate (委托)类型,参数x是double类型,返回的结果也是double类型。看好了哦,这句的重点是 delegate这个类型,像MyFunction(方法名)以及参数x啥的随便起名(也不是随便还是要meaningful一点的哦)。这个delegate类型搭载了很多三角函数,对数,指数,多项式,等等我们数学上常用到的那些公式。举个例子吧,下面的那4行代码,定义一个 delegate类型的函数变量(f),然后f可以调用好些个数学函数(Math.Sin,Math.Exp),然后通过变量(y)来执行这些数学函数,再把结果放在别的变量中显示。
MyFunction f = Math.Sin;
double y = f(4); //y=sin(4)
f = Math.Exp;
y = f(4); //y=exp(4)
王薇
翻译于 2012/12/27 17:47
1

要代替强类型委托,你可以使用泛型函数类型Func<T 1, T 2, T 3, ...,T n, Tresult> T 1, T 2, T 3, ...,T n都是参数类型(用于有很多参数的函数),并且result是返回类型。在下列列表中显示了相当于前面代码的一个示例:

Func<double, double> f = Math.Sin;
double y = f(4); //y=sin(4)
f = Math.Exp;
y = f(4); //y=exp(4)
L
翻译于 2013/01/07 10:53
1

你可以定义你的委托名称或者使用泛型类型。基于Func,你有两个类似的泛型类型:

    ● Predicate<T1, T2, T3, ...,Tn>表示一个返回true/false的函数 - 相当于Func<T1, T2, T3, ...,Tn, bool>

    ● Action<T1, T2, T3, ...,Tn> 表示一个没有任何返回值的程序 - 相当于Func<T1, T2, T3, ...,Tn, void>

L
翻译于 2013/01/07 11:12
1

Predicate 是一个带有很多参数并且返回true 或false的函数。下面的例子显示了一个接收string 参数Predicate函数。这个函数的值设为String.IsNullOrEmpty。这个函数接收一个string 参数并且返回这个string 参数是否为空的信息 - 因此它匹配Predicate<string>类型。

Predicate<string> isEmptyString = String.IsNullOrEmpty;
if (isEmptyString("Test"))
{
    throw new Exception("'Test' cannot be empty");
}
要代替 Predicate<string>,你可以使用Func<string, bool>。
L
翻译于 2013/01/07 11:32
1

Actions 是一种可执行的程序。它接收一些参数但没有返回值。下面这个示例显示了一个接收string参数但指向标准Console.WriteLine 方法的action。

Action<string> println = Console.WriteLine;
println("Test");
当一个 action 引用和参数被调用时,调用被转到了Console.WriteLine 方法。当你使用Action类型,你需要声明一个输入参数列表,因为它们没有返回值。在这个示例中,Action<string>相当于Func<string, void>。
L
翻译于 2013/01/07 11:42
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(7)

BinSys
BinSys
好文章,虽然不是全能看懂
crossmix
crossmix
好像别扭
evang
evang
好长啊
cypbkd
cypbkd
这个文章太好了!
renwofei423
renwofei423

引用来自“JollyRoge”的评论

搞一个翻译比赛吧

翻译,然后抽奖品
@红薯
JollyRoger
JollyRoger
搞一个翻译比赛吧
返回顶部
顶部