6.5.2 C# 中的函数组合
6.5.2 C# 中的函数组合
C# 中的函数组合是可能的。但使用非常有限,这是部分是由于在 C# 中散应用不能非常easy使用。但更重要的是,由于大多数操作是用成员来写的。而不是函数。但我们至少能够用 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# 中,写这种函数非常easy,由于。我们不必显式写出类型,由于类型判断已经自己主动判断出类型。因此。如今要近距离了解这种机制是怎样工作的。
6.5.2 C# 中的函数组合的更多相关文章
- 理解函数式编程中的函数组合--Monoids(二)
使用函数式语言来建立领域模型--类型组合 理解函数式编程语言中的组合--前言(一) 理解函数式编程中的函数组合--Monoids(二) 继上篇文章引出<范畴论>之后,我准备通过几篇文章,来 ...
- 复杂的 Hash 函数组合有意义吗?
很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...
- [Java 8] (10) 使用Lambda完成函数组合,Map-Reduce以及并行化
好文推荐!!!!! 原文见:http://blog.csdn.net/dm_vincent/article/details/40856569 Java 8中同时存在面向对象编程(OOP)和函数式编程( ...
- Scalaz(14)- Monad:函数组合-Kleisli to Reader
Monad Reader就是一种函数的组合.在scalaz里函数(function)本身就是Monad,自然也就是Functor和applicative.我们可以用Monadic方法进行函数组合: i ...
- JavaScript中Eval()函数的作用
这一周感觉没什么写的,不过在研究dwz源码的时候有一个eval()的方法不是很了解,分享出来一起学习 -->首先来个最简单的理解 eval可以将字符串生成语句执行,和SQL的exec()类似. ...
- 【原创】Matlab中plot函数全功能解析
[原创]Matlab中plot函数全功能解析 该帖由Matlab技术论(http://www.matlabsky.com)坛原创,更多精彩内容参见http://www.matlabsky.com 功能 ...
- F# 可以把几个函数组合成新函数
C#能做的,F#基本都能做,但F#能做的,C#未必能做. F#中的函数可以把几个函数组合起来使用.下面的例子是把由 function1 和 function2 这两个函数通过运算符“>>” ...
- Matlab中plot函数全功能解析
Matlab中plot函数全功能解析 功能 二维曲线绘图 语法 plot(Y)plot(X1,Y1,...)plot(X1,Y1,LineSpec,...)plot(...,'PropertyName ...
- VBScript中Msgbox函数的用法
MsgBox(prompt[, buttons][, title][, helpfile, context]) [用途]:弹出对话框,并获取用户的操作结果. [参数说明]: propmt:对话框中展示 ...
随机推荐
- if判断语句
6)if判断语句 if ... then else end if; if ... then elsif ... then elsif ... then else ...
- Oracle expdp导出多表或表中的部分数据
http://blog.itpub.net/16582684/viewspace-755072/
- WinServer-AD操作常用powershell命令
powershell 操作AD常用命令 查询AD中默认的密码策略 Get-ADDefaultDomainPasswordPolicy 查询AD中密码永不过期的用户 Get-ADUser -Filter ...
- jquery mobile常用的data-role类型介绍
转自原文 jquery mobile常用的data-role类型介绍 data-role参数表: page 页面容器,其内部的mobile元素将会继承这个容器上所设置的属性 header ...
- 扩展MARA 加入Z字段BAPI_TE_MARA
1. 在MARA中APPEND新的结构 2.在BAPI_TE_MARA中APPEND新的结构 (可是这里不能有QUAN,CURR,DEC等数据类型) 3.在BAPI_TE_MARAX中APPEND新的 ...
- android drawable资源调用使用心得
1. 调用顺序 android 调用应用图片资源时,会优先选择当前手机屏幕dpi对应的的文件夹(如drawable-ldpi, drawable-mdpi, drawable-hdpi, drawab ...
- linux文件上传下载
上传本地文件到服务器:scp 文件名 账号@服务器IP:文件路径eg:scp test.txt root@192.168.0.123:/tmp/服务器文件下载到本地:scp 账号@服务器IP:文件 本 ...
- Mysql实战45讲 04讲深入浅出索引(上)读书笔记 极客时间
极客时间 Mysql实战45讲 04讲深入浅出索引 极客时间(上)读书笔记 笔记体悟 1.索引的作用:提高数据查询效率2.常见索引模型:哈希表.有序数组.搜索树3.哈希表:键 - 值(key - v ...
- C# Lambda && Linq
Lambda表达式在C#3.0加入,它是一个匿名函数,可用于创建委托或者表达式树类型,运算符为=>,读作"goes to",=>左侧是变量,右侧是表达式,变量类型可以自 ...
- CSS3的常用属性(二)
边框 边框圆角 border-radius: 100px 每个角可以设置两个值,x和y 补充: 可分别设置长,短半径,以“/”进行分隔,遵循顺时针的顺序,“/”之前为横轴半径,“/”之后为纵轴半径,如 ...