1.泛型编程(C++模板) 其中,Ada, Delpha, Java, C#, Swift 称之为 泛型/generics; ML, Scala和 Haskell 称之为 参数多态/parametric polymorphism; C++和D语言称之为 模板/template. <设计模式/Design Patterns>称之为 参数化类型/parameterized type. 因为在这里,参数的类型在一般情况下都是未知的,而泛型编程可以支持多种类型,所以叫泛/generic. ①函数模板/…
函数式编程 阮一峰 <函数式编程初探>,阮一峰是<黑客与画家>的译者. wiki <函数编程语言> 一本好书,<计算机程序的构造与解释>有讲到scheme lisp, 不过是作为工具.重点还是再讲方法论,虽然只看了前言,已经觉得是非常好的书,非常有高度. 写这段话的人叫 艾伦佩利.他为这本书做的序,写的更好.非常有高度,非常有智慧,即使不读这本书,也推荐读一下序. <解释>是作为MIT的课程教材.其中提到了另一门课 6.231 可以作为该可的前导…
实验平台:Win7,VS2013 Community,GCC 4.8.3(在线版) 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能力,模板使 C++ 编程变得异常灵活,能实现很多高级动态语言才有的特性(语法上可能比较丑陋,一些历史原因见下文).普通用户对 C++ 模板的使用可能不是很频繁,大致限于泛型编程,但一些系统级的代码,尤其是对通用性.性能要求极高的基础库(如 STL.Boost)几乎不可避免的都大量地使用 C++ 模板,一个稍有规模的大量使用模板…
既然是泛函编程,多了解一下函数自然是免不了的了: 方法(Method)不等于函数(Function) 方法不是函数但可以转化成函数:可以手工转换或者由编译器(compiler)在适当的情况下自动转换.反向转换则不然:函数是无法转换到方法的.先看看下面的例子: scala> def aMethod(x: Int): Int = x + 10 aMethod: (x: Int)Int scala> val aFunction = (x: Int) => x + 10 aFunction: I…
在上一节我们介绍了Monad.我们知道Monad是一个高度概括的抽象模型.好像创造Monad的目的是为了抽取各种数据类型的共性组件函数汇集成一套组件库从而避免重复编码.这些能对什么是Monad提供一个明确的答案吗?我们先从上节设计的Monad组件库中的一些基本函数来加深一点对Monad的了解: trait Monad[M[_]] extends Functor[M] { def unit[A](a: A): M[A] def flatMap[A,B](ma: M[A])(f: A => M[B]…
Option是一种新的数据类型.形象的来描述:Option就是一种特殊的List,都是把数据放在一个管子里:然后在管子内部对数据进行各种操作.所以Option的数据操作与List很相似.不同的是Option的管子内最多只能存放一个元素,在这个方面Option的数据操作就比List简单的多,因为使用者不必理会数据元素的位置.顺序.Option只有两种状态:包含一个任何类型的元素或者为空.或者这样讲:一个Option实例包含 0 或 1 个元素:None代表为空,Some(x)代表包含一个任意类型的…
模板与泛型编程 --模板定义 引言: 所谓泛型程序就是以独立于不论什么特定类型的方式编写代码.使用泛型程序时,我们须要提供详细程序实例所操作的类型或值. 模板是泛型编程的基础.使用模板时能够无须了解模板的定义. 泛型编程与面向对象编程一样,都依赖于某种形式的多态性.面向对象编程中的多态性在执行时应用于存在继承关系的类.我们能够编写使用这些类的代码,忽略基类与派生类之间类型上的差异.仅仅要使用基类的引用或指针,基类类型或派生类类型的对象就能够使用同样的代码. 在泛型编程中,我们所编写的类和函数能够…
在阅读函数式编程相关资料时,看到如下一段话.感觉说的很好,可以帮助我这种学渣一点点的建立起整个知识体系. 以下片段,摘抄自豆瓣网友 赛义甫 的豆列 “逻辑与计算” 中的一段介绍. 莱布尼兹曾经有两个梦想: . 创建一种“普遍语言”(universal language)使得任何问题都可以用这种语言表述: . 找到一种"判定方法"(decision method)以解决所有可以在“普遍语言”中所表述的问题. 这两个问题是上百年来数理逻辑.数学哲学和数学基础问题的核心.实质.对前一个问题的…
最近比较闲,打算整理一下之前学习的关于程序语言的知识.主要的内容其实就是一边设计程序语言一边写解释器实现它.这些知识基本上来自Programming Languages and Lambda Calculi和Essentials of Programming Languages这两本书. 我还记得高中奥数竞赛培训时的老师这样说过:“解题时一定要抓住定义.” 编程和解题一样,也要抓住定义. 所以在写解释器前,得先定义好这门要解释的程序语言. 这门程序语言基于Lambda演算. 从\(\lambda…
最近在重温<c++程序设计新思维>这本经典著作,感慨颇多.由于成书较早,书中很多元编程的例子使用c++98实现的.而如今c++20即将带着concept,Ranges等新特性一同到来,不得不说光阴荏苒.在c++11之后,得益于新标准很多元编程的复杂技巧能被简化了,STL也提供了诸如<type_traits>这样的基础设施,c++14更是大幅度扩展了编译期计算的适用面,这些都对元编程产生了不小的影响.今天我将使用书中最简单也就是最基础的元容器TypeList来初步介绍现代c++在元编…