第二章 Getting started with functional programming
Getting started with functional programming
开始函数式编程
higher-order functions-高阶函数
所有FP语言的主要特点是函数可以像普通值一样处理。它们可以存储到变量中,放入集合和结构中,作为参数传递给其他函数,并作为结果从其他函数返回。
将其他函数作为参数或返回新函数的函数称为高阶函数。
下面这两个模式在FP中很常见:
filter: (collection<T>, (T → bool)) -> collection<T>
transform: (collection<In>, (In -> Out)) -> collection<Out>
STL中的高阶函数示例
如何求一组数的平均值?
double average_score(const std::vector<int>& scores)
{
int sum = 0;
for (int score : scores)
{
sum += score;
}
return sum / (double)scores.size();
}
利用std::accumulate:
double average_score(const std::vector<int>& scores)
{
return std::accumulate(
scores.cbegin(), scores.cend(),
0
) / (double)scores.size(); // 初始值为0并求范围的和
}
在c++17中,可以实现并行计算:
double average_score(const std::vector<int>& scores)
{
return std::reduce(
std::execution::par,
scores.cbegin(), scores.cend(),
0
) / (double) scores.length();
}
也可以增加一个函数对象,改为求乘积:
double scores_product(const std::vector<int>& scores)
{
return std::accumulate(
scores.cbegin(), scores.cend(),
1,
std::multiplies<int>()
);
}
Folding
上述std::accumulate算法就是folding概念的实现。Folding将一般的迭代过程抽象成递归结构。
它首先将传递给它的初始值和集合中的第一项相加,然后将该结果与集合中的下一项进行相加,以此类推,一直重复,直到集合的末尾。如下图所示:
下面是计算一个string中'\n'的个数的算法:
int f(int pre_count, char ch)
{
return c != '\n' ? pre_count : pre_count + 1;
}
int count_lines(const std::string& s)
{
return std::accumulate(
s.cbegin(), s.cend(),
0,
f
);
}
其中:
f: (R, T) -> R -- 集合元素类型为T, 初值类型为R
对于那个累加的版本,也可以这样理解,将f看作是+运算:
这种从范围的开始来处理元素的叫做left-fold。
还有right-fold,它表示从范围的结束也就是最后一个元素开始处理,一直到第一个元素。
下图是左右折叠的区别:
C++并不提供right-fold的算法,但是可以通过反向迭代器crbegin和 crend来实现相同的效果
第二章 Getting started with functional programming的更多相关文章
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二章:矩阵代数
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二章:矩阵代数 学习目标: 理解矩阵和与它相关的运算: 理解矩阵的乘 ...
- Coursera公开课Functional Programming Principles in Scala习题解答:Week 2
引言 OK.时间非常快又过去了一周.第一周有五一假期所以感觉时间绰绰有余,这周中间没有假期仅仅能靠晚上加周末的时间来消化,事实上还是有点紧张呢! 后来发现每堂课的视频还有相应的课件(Slide).字幕 ...
- [A Top-Down Approach][第二章 应用层]
[A Top-Down Approach][第二章 应用层] 标签(空格分隔): 未分类 网络应用是计算机网络存在的理由 首先从定义几个关键的应用层概念开始 应用程序所需要的网络服务,客户和服务器,进 ...
- 第二章排错的工具:调试器Windbg(上)
感谢博主 http://book.51cto.com/art/200711/59731.htm <Windows用户态程序高效排错>第二章主要介绍用户态调试相关的知识和工具.本文主要讲了排 ...
- Java 中的函数式编程(Functional Programming):Lambda 初识
Java 8 发布带来的一个主要特性就是对函数式编程的支持. 而 Lambda 表达式就是一个新的并且很重要的一个概念. 它提供了一个简单并且很简洁的编码方式. 首先从几个简单的 Lambda 表达式 ...
- Unity文档阅读 第二章 依赖注入
Introduction 介绍Chapter 1 outlines how you can address some of the most common requirements in enterp ...
- Gradle2.0用户指南翻译——第二章. 概述
翻译项目请关注Github上的地址:https://github.com/msdx/gradledoc本文翻译所在分支:https://github.com/msdx/gradledoc/tree/2 ...
- [学习笔记—Objective-C]《Objective-C-基础教程 第2版》第二章~第七章
在看完<Objective-C 程序设计 第6版>之后,看了一些关于iOS开发职位的面试题,发现自身基础非常是不牢,于是打算以查缺补漏的方式阅读还有一本关于Objective-C的基础书籍 ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
随机推荐
- 【WPF学习】第五十一章 动画缓动
线性动画的一个缺点是,它通常让人觉得很机械且不能够自然.相比而言,高级的用户界面具有模拟真实世界系统的动画效果.例如,可能使用具有触觉的下压按钮,当单击时按钮快速弹回,但是当没有进行操作时它们会慢慢地 ...
- python爬虫-MongoDB安装配置
MongoDB安装配置: 在安装配置MongoDB的过程中遇到了很多问题,现在重新梳理一遍安装流程.遇到的问题及其解决方法 系统版本:Windows 10 MongoDB版本:4.2.1 1.下载地址 ...
- 大厂面试题:集群部署时的分布式 session 如何实现?
面试官心理分析 面试官问了你一堆 dubbo 是怎么玩儿的,你会玩儿 dubbo 就可以把单块系统弄成分布式系统,然后分布式之后接踵而来的就是一堆问题,最大的问题就是分布式事务.接口幂等性.分布式锁, ...
- 《数字信号处理》课程实验1 – FFT的实现
一.按时间抽选的基-2 FFT实现原理 观察DIT(基2)FFT的流图(N点,N为2的幂次),可以总结出如下规律: (1)共有\(L=\log_2N\)级蝶形运算: (2)输入倒位序,输出自然顺序: ...
- Vue2.0组件的继承与扩展
如果有需要源代码,请猛戳源代码 希望文章给大家些许帮助和启发,麻烦大家在GitHub上面点个赞!!!十分感谢 前言 本文将介绍vue2.0中的组件的继承与扩展,主要分享slot.mixins/exte ...
- 微信Android自动播放视频(可交互,设置层级,无控制条,非X5)ffmpeg,jsmpeg.js,.ts视频
原料: ffmpeg : http://ffmpeg.zeranoe.com/builds/ win64 https://evermeet.cx/ffmpeg/ mac OS X 64 jsmp ...
- ionic监听android返回键(实现“再按一次退出”功能)
在android平台上的app,在主页面时经常会遇到"再按一次退出app"的功能,避免只按一下返回键就退出app提升体验优化. 1.这个功能需要我们用到ionic提供的regist ...
- vue实现选中效果
前情提要 好久没有写Vue了,略有生疏,这个东西还是得多用.下午看到一个需求,选择相册图片作为轮播图显示.接口返回相册列表,用户选一下再扔回去.直到我看到e.target.className我就知道这 ...
- js数组冒泡排序、快速排序、插入排序
1.冒泡排序 //第一种 function bubblesort(ary){ for(var i=0;i<ary.length-1;i++){ for(var j=0;j<ary.leng ...
- Flask css 无法实时更新
css代码改完了,但是查看网页源代码css的内容还是很久之前的,根本没有更新 解决方法: 1.浏览器缓存.使用ctrl+F5刷新一下页面 2. 3. from datetime import time ...