6.5.2 C# 中的函数组合

728 篇文章 1 订阅
349 篇文章 0 订阅

6.5.2 C# 中的函数组合

 

C# 中的函数组合是可能的,但使用非常有限,这是部分是由于在 C# 中散应用不能很容易使用,但更重要的是,因为大多数操作是用成员来写的,而不是函数。但我们至少可以用 C# 演示同样的想法,清单 6.18 显示了 Compose 方法的实现,以及使用的示例。

 

清单 6.18实现并使用 Compose 方法 (C#)

static Func<A, C> Compose<A, B,C>(this Func<A, B> f, Func<B, C> g) {

  return(x) => g(f(x));    [1]

}

 

// Using function composition in C#                   |

Func<double, double> square = (n)=> n * n;            |[2]

Func<double, string> formatNum = (n)=> n.ToString("E");  |

 

var data = new double[] { 1.1, 2.2, 3.3 };

var sqrs =data.Select(square.Compose(formatNum)); [3]

 

// Prints: "1.210000E+000";"4.840000E+000"; "1.089000E+001"

foreach (var s in sqrs) Console.Write(s);

 

函数组合被实现为 Func <T, R> 委托的扩展方法,因此,我们可以使用点表示法在函数值上调用,只传递一个参数值;在 F# 中,这被写成有三个参数的函数,虽然,通常只用到两个参数值;在 C# 中,我们必须将它实现作为有两个参数值的方法,显式返回 Func 委托。我们构建 lambda 函数,有一个参数值,调用将要组合的函数[1],并返回该函数作为委托。

为了测试这个方法,我们创建了两个想要组合的函数[2],在用 Select 处理集合中的数字时,使用组合函数。我们没有显式指定 lambda 函数作为参数值,而是调用 Compose 创建组合函数值,把它传递给 Select 方法[3]。

在最后几节中,我们已经知道,很多有用的处理函数都是泛型,其中有些甚至有三个类型参数。在 F# 中,写这样的函数很容易,因为,我们不必显式写出类型,因为类型推断已经自动推断出类型。因此,现在要近距离了解这种机制是如何工作的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值