Scalaz(0) - 写在前面

面向对象编程范畴(OOP)从80年代C++到90年代java的兴起已经经历了几十年的高潮,是不是已经发展到了尽头,该是函数式编程(FP)开始兴旺发达的时候了吧。这样说似乎心眼儿有点坏,可能会得罪当今大多数的编程人员。不过计算机硬件技术的发展往往会催生新的编程技术,这倒是无可反驳的现象。当今世界上计算机行业中大数据、电子商务、多核CPU,高并发网络的普及使得C++,java这些OOP范畴的编程语言显得那么地不尽人意,函数式编程范畴的编程语言将成为主流,这应该是句大实话了吧。

说到函数式编程(FP)我们常常会联想到以下几个方面:

1、不可变性 - Immutability

2、函数既值 - Function as value

3、无副作用 - No side effects

这几样特性可以很好地解决多核CPU、多线程、高并发问题。

scala是个OOP和FP混合范畴的编程语言。这是因为考虑到那么许多从OOP世界过来的编程人员可以尽快上手,而且有许多问题可能用OOP方式能得到更好的解决。但重要的是在使用scala编程中到底以OOP还是FP为主。如果我们采用scala的FP为主的话,scala标准库(sdandard library)中的数据类型和函数组件就显得不足够应付,我们必须在用scala FP开发软件前准备好一套较为完整的函数组件库(combinator library)。幸运的是我们现在有了scalaz,它使我们在泛函编程的道路上节省了一大段路程。

scalaz是一套用scala语言编写的函数库。scalaz为用户提供了大量的数据类型和组件函数来支持函数式编程。实际上scalaz的代码贡献者们是受到了纯函数式编程语言haskell的启发,把haskell中的数据类型、结构、函数组件在scalaz中用scala进行了重新实现。既然我们打算采用scala的FP,我们可能必须把scalaz作为基础组件库来使用,那么我们必须首先了解scalaz的库结构、里面各种数据类型和组件函数、掌握它们的使用方式以及应用模式。

当然,在学习和介绍scalaz的过程中我们还可以更多了解scala的函数式编程模式以及它所著名的贴切简洁的表现形式。

让我们期待这个系列的scalaz讨论能真正的把我们带入函数式编程范畴的世界。。。

时间: 2024-10-07 22:53:01

Scalaz(0) - 写在前面的相关文章

【转载】.NET面试题系列[0] - 写在前面

原文:.NET面试题系列[0] - 写在前面 索引: .NET框架基础知识[1] - .NET框架基础知识(1) http://www.cnblogs.com/haoyifei/p/5643689.html .NET框架基础知识[2] - .NET框架基础知识(2) http://www.cnblogs.com/haoyifei/p/5646288.html .NET框架基础知识[3] - C# 基础知识(1) - http://www.cnblogs.com/haoyifei/p/565054

记录二:tensorflow2.0写MNIST手写体

最近学习神经网络,tensorflow,看了好多视频,查找了好多资料,感觉东西都没有融入自己的思维中.今天用tensorflow2.0写了一个MNIST手写体的版本,记录下学习的过程. 复现手写体识别的基本步骤:准备数据,处理数据,搭建模型,迭代训练模型,使用模型. 一.全连接模型 1.导入数据集(此次编写运行均在notebook) 先引入所需模块,在用tf.keras下载数据 2.分析图片的大小 1)用shape查看数量大小:2)通过指定[0][1]来查看具体图像尺寸,lable存储的是ima

用extjs6.0写一个系统登录及注销

本文基于ext-6.0.0 一.用sencha cmd建立一个ExtJs小项目 首先,需要一个命令行工具.进入extjs所在目录. 然后,输入:sencha -sdk [ExtJs6.0文件夹地址] generate app [项目名称] [项目路径] 例如:sencha -sdk ext-6.0.0 generate app App MyApp (注):还可以加--classic或--modern建立pc或WAP单独项目 二.在浏览器打开 命令行输入:sencha app watch 三.开始

Extjs6(三)——用extjs6.0写一个简单页面

本文基于ext-6.0.0 一.关于border布局 在用ext做项目的过程中,最常用到的一种布局就是border布局,现在要写的这个简单页面也是运用border布局来做.border布局将页面分为五个部分,分别是north.south.west.east.center,对应着上.下.左.右.中,下面看一个简单的border布局的例子. Ext.define('Learning.view.treelearn.trees', { extend: 'Ext.panel.Panel', xtype:'

.NET面试题系列[0] - 写在前面

经过了四年的工作,我已经跳槽6次了.这四年我全部都使用C#进行开发,除了获得到的offer之外,还面试失败或拒掉了不少offer,加起来面试的次数至少有30次.这些面试有质量很高的,也有泛泛而谈的,不同面试有时候还会问到几乎相同的问题,通过对问题的深入程度,可以大致判断一家公司和面试官的水平. 跳槽就是为了更好的生活.而改善生活需要有强大的业务能力,说服面试官在众多候选人中选择你作为胜利者.在若干年的工作学习中,我的水平也慢慢上升,一开始是什么都不会,后来会一些东西,到现在也可以从面试官的问题中

Lua1.0 写在最初

为什么是 Lua忘记是什么时候接触到 Lua 的了,也忘记是为什么接触到她的.现在想想,也许是因为下面两个原因:WOW 里有用到她,我上学的时候,玩过一段时间 WOW,了解一点 WOW 插件的编写,当时觉得这个语言挺有意思的.她是由 C 代码实现的,下载代码看了一下,发现她的官方实现的 C 代码写得很好,我是一个代码爱好者,面对这么优秀的代码,有种相见恨晚之感. 为什么是 Lua1.0我是一个代码爱好者,总觉得看代码的最初实现会比较容易把握作品的脉络.我不知道这种学习方法对不对,不过,或许是强迫

用Turbo C 2.0写五子棋小游戏

这辈子再也不用Turbo C写东西了_(:зゝ∠)_ 功能 有比较友好(大概友好吧:) )的界面. 采用贪心算法,能与计算机对弈 流程图 主函数 int main() { int gd = DETECT, gm = 0; int key; initgraph(&gd, &gm, "c:\\tc"); opencartoon(); /*开场动画*/ init(); /*界面和棋盘初始化*/ key = get_key(); while (!quit) { /*只要没有退出

0 写在前面的话

0. 简介 操作系统是计算机科学中十分重要的一门基础学科,是一名计算机专业毕业生必须要具备的基础知识.但是在学习这门课时,如果仅仅把目光停留在课本上一些关于操作系统概念上的叙述,并不能对操作系统有着深层次的理解.必须要结合动手实践,才能真正掌握核心的知识. MIT的操作系统课程6.828是一门被广泛好评的入门课程.它最重要的特点就是它实践第一的教学原则.在这门课程中会涉及到非常丰富的实验,也会有非常多的动手机会.而且授课者更是亲自构建了一个简化的基于Unix内核的操作系统xv6.所有的实验都是在

用cocos2d3.0写一个srpg游戏-移动部分的实现

确定SRPG一个人物的移动范围, 我用的是比较傻的穷举法, 其实就是把人物可移动长度的每一个点都判断一下是否可以移动, 然后根据地形对人物影响的障碍等级, 每走一步,就少一个障碍等级的行走能力. 具体看代码 void SearchPathForSLG::init(TMXTiledMap* map, Point heroIndex,int runLength,bool movePath[][255]){ Point mapSize=Point(map->getMapSize().width,map