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# 中的函数组合的更多相关文章

  1. 理解函数式编程中的函数组合--Monoids(二)

    使用函数式语言来建立领域模型--类型组合 理解函数式编程语言中的组合--前言(一) 理解函数式编程中的函数组合--Monoids(二) 继上篇文章引出<范畴论>之后,我准备通过几篇文章,来 ...

  2. 复杂的 Hash 函数组合有意义吗?

    很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...

  3. [Java 8] (10) 使用Lambda完成函数组合,Map-Reduce以及并行化

    好文推荐!!!!! 原文见:http://blog.csdn.net/dm_vincent/article/details/40856569 Java 8中同时存在面向对象编程(OOP)和函数式编程( ...

  4. Scalaz(14)- Monad:函数组合-Kleisli to Reader

    Monad Reader就是一种函数的组合.在scalaz里函数(function)本身就是Monad,自然也就是Functor和applicative.我们可以用Monadic方法进行函数组合: i ...

  5. JavaScript中Eval()函数的作用

    这一周感觉没什么写的,不过在研究dwz源码的时候有一个eval()的方法不是很了解,分享出来一起学习 -->首先来个最简单的理解 eval可以将字符串生成语句执行,和SQL的exec()类似. ...

  6. 【原创】Matlab中plot函数全功能解析

    [原创]Matlab中plot函数全功能解析 该帖由Matlab技术论(http://www.matlabsky.com)坛原创,更多精彩内容参见http://www.matlabsky.com 功能 ...

  7. F# 可以把几个函数组合成新函数

    C#能做的,F#基本都能做,但F#能做的,C#未必能做. F#中的函数可以把几个函数组合起来使用.下面的例子是把由 function1 和 function2 这两个函数通过运算符“>>” ...

  8. Matlab中plot函数全功能解析

    Matlab中plot函数全功能解析 功能 二维曲线绘图 语法 plot(Y)plot(X1,Y1,...)plot(X1,Y1,LineSpec,...)plot(...,'PropertyName ...

  9. VBScript中Msgbox函数的用法

    MsgBox(prompt[, buttons][, title][, helpfile, context]) [用途]:弹出对话框,并获取用户的操作结果. [参数说明]: propmt:对话框中展示 ...

随机推荐

  1. 2019-03-14 Python爬虫问题 爬取网页的汉字打印出来乱码

    html = requests.get(YieldCurveUrl, headers=headers) html=html.content.decode('UTF-8') # print(html) ...

  2. Bing地图切片原理

    Bing地图切片系统 Bing地图提供了一个可以直接平移和缩放的世界地图.为了让地图操作更加平滑和及时响应,我们选择提前渲染地图不同层级的细节,并把每个层级的地图切割成为瓦片以便快速的还原展示.这篇文 ...

  3. MFC 加入背景图片并让控件背景透明

    /*加入背景图片*/ BOOL CTOOLDlg::OnEraseBkgnd(CDC* pDC) {  // TODO: 在此加入消息处理程序代码和/或调用默认值  CDialog::OnEraseB ...

  4. Android,iOS打开手机QQ与指定用户聊天界面

    在浏览器中能够通过JS代码打开QQ并弹出聊天界面.一般作为客服QQ使用. 而在移动端腾讯貌似没有发布提供相似API,可是却能够使用schema模式来启动手机QQ. 下面为详细代码: Android: ...

  5. m_Orchestrate learning system---十一、thinkphp查看临时文件的好处是什么

    m_Orchestrate learning system---十一.thinkphp查看临时文件的好处是什么 一.总结 一句话总结:可以知道thinkphp的标签被smarty引擎翻译而来的php代 ...

  6. 使用NFS共享硬盘

    1. 安装 sudo apt install nfs-kernel-server   2. 配置   sudo vi /etc/exports   /mnt/NewDisk *(rw,sync,no_ ...

  7. Linux进程精讲

    进程相关概念 程序和进程 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu.内存.打开的文件.设备.锁....) 进程,是一个抽象的概念,与操作系统原理联系紧密.进程是活跃的程序,占用系 ...

  8. POJ 3617 Best Cow Line 贪心算法

    Best Cow Line Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26670   Accepted: 7226 De ...

  9. PostgreSQL+PostGIS

    PostGIS简介 PostGIS是对象关系型数据库系统PostgreSQL的一个扩展,PostGIS提供如下空间信息服务功能:空间对象.空间索引.空间操作函数和空间操作符.同时,PostGIS遵循O ...

  10. poj1170 - 转换成背包

    题目链接 有5种物品,给出每个物品的单价. 给出几个这些物品的组合和这个组合的价格.买组合要比一件件的买便宜. 问给定的购买计划最少花多少钱. ---------------------------- ...