随笔分类 -  Functional Programming

泛函编程
摘要:上两期我们讨论了Monad。我们说Monad是个最有概括性(抽象性)的泛函数据类型,它可以覆盖绝大多数数据类型。任何数据类型只要能实现flatMap+unit这组Monad最基本组件函数就可以变成Monad实例,就可以使用Monad组件库像for-comprehension这样特殊的、Monad... 阅读全文
posted @ 2015-05-12 16:52 雪川大虫 阅读(1104) 评论(1) 推荐(0)
摘要:在上一节我们介绍了Monad。我们知道Monad是一个高度概括的抽象模型。好像创造Monad的目的是为了抽取各种数据类型的共性组件函数汇集成一套组件库从而避免重复编码。这些能对什么是Monad提供一个明确的答案吗?我们先从上节设计的Monad组件库中的一些基本函数来加深一点对Monad的了解: ... 阅读全文
posted @ 2015-05-05 17:16 雪川大虫 阅读(1333) 评论(0) 推荐(0)
摘要:简单来说:Monad就是泛函编程中最概括通用的数据模型(高阶数据类型)。它不但涵盖了所有基础类型(primitive types)的泛函行为及操作,而且任何高阶类或者自定义类一旦具备Monad特性就可以与任何类型的Monad实例一样在泛函编程中共同提供一套通用的泛函编程方式。所以有人把泛函编程视... 阅读全文
posted @ 2015-04-27 23:48 雪川大虫 阅读(1488) 评论(1) 推荐(0)
摘要:在上一节我们讨论了Monoid的结合性和恒等值的作用以及Monoid如何与串类元素折叠算法相匹配。不过我们只示范了一下基础类型(primitive type)Monoid实例的应用,所以上一节的讨论目的是理论多于实践。在这一节我们将把重点放在一些实用综合类型(composite type)Mon... 阅读全文
posted @ 2015-04-22 17:08 雪川大虫 阅读(1439) 评论(0) 推荐(0)
摘要:Monoid是数学范畴理论(category theory)中的一个特殊范畴(category)。不过我并没有打算花时间从范畴理论的角度去介绍Monoid,而是希望从一个程序员的角度去分析Monoid以及它在泛函编程里的作用。从这个思路出发我们很自然得出Monoid就是一种数据类型,或者是一种在... 阅读全文
posted @ 2015-04-20 22:52 雪川大虫 阅读(2367) 评论(1) 推荐(0)
摘要:上两节我们建了一个并行运算组件库,实现了一些基本的并行运算功能。到现在这个阶段,编写并行运算函数已经可以和数学代数解题相近了:我们了解了问题需求,然后从类型匹配入手逐步产生题解。下面我们再多做几个练习吧。在上节我们介绍了asyncF,它的类型款式是这样的:asyncF(f: A => B): A... 阅读全文
posted @ 2015-04-13 22:45 雪川大虫 阅读(1021) 评论(3) 推荐(2)
摘要:上节我们讨论了并行运算组件库的基础设计,实现了并行运算最基本的功能:创建新的线程并提交一个任务异步执行。并行运算类型的基本表达形式如下: 1 import java.util.concurrent._ 2 object Par { 3 type Par[A] = ExecutorServic... 阅读全文
posted @ 2015-04-12 00:36 雪川大虫 阅读(1057) 评论(2) 推荐(1)
摘要:作为专业的编程人员,我们经常会因为工作需要建立一些工具库。所谓工具库就是针对工作上经常会遇到的一些共性问题预先编制的由一整套函数所组成的函数库。通常这些工具库的功能都是在特别定制的一些数据类型支持下由一系列函数围绕着这些数据类型进行运算而实现的。在泛函编程范畴内也不例外。但在泛函工具库里的函数则... 阅读全文
posted @ 2015-04-04 13:14 雪川大虫 阅读(1086) 评论(0) 推荐(1)
摘要:对OOP编程人员来说,泛函状态State是一种全新的数据类型。我们在上节做了些介绍,在这节我们讨论一下State类型的应用:用一个具体的例子来示范如何使用State类型。以下是这个例子的具体描述:模拟一个自动糖果贩售机逻辑:贩售机有两种操作方法:投入硬币和扭动出糖旋钮。贩售机可以处于锁定和放开两... 阅读全文
posted @ 2015-03-27 23:13 雪川大虫 阅读(1006) 评论(0) 推荐(0)
摘要:初接触泛函状态觉着很不习惯。主要是在使用State数据类型时很难理解其中的原理,特别是泛函状态变迁机制(state transition mechanism):怎么状态就起了变化,实在难以跟踪。我想这主要是因为状态变迁机制经过了函数组合,已经深深的埋藏在运行代码后面。上节我们讨论到RNG,对于了... 阅读全文
posted @ 2015-03-26 19:06 雪川大虫 阅读(1839) 评论(0) 推荐(0)
摘要:对于OOP程序员来说,泛函状态变迁(functional state transition)是一个陌生的课题。泛函状态变迁是通过泛函状态数据类型(functional state)来实现的。State是一个出现在泛函编程里的类型(type)。与其它数据类型一样,State同样需要自身的一套泛函操... 阅读全文
posted @ 2015-03-25 12:13 雪川大虫 阅读(1395) 评论(0) 推荐(1)
摘要:虽然明白泛函编程风格中最重要的就是对一个管子里的元素进行操作。这个管子就是这么一个东西:F[A],我们说F是一个针对元素A的高阶类型,其实F就是一个装载A类型元素的管子,A类型是相对低阶,或者说是基础的类型。泛函编程风格就是在F内部用对付A类的函数对里面的元素进行操作。但在之前现实编程中确总是没... 阅读全文
posted @ 2015-03-24 10:44 雪川大虫 阅读(1143) 评论(1) 推荐(0)
摘要:上节我们提到Stream和List的主要分别是在于Stream的“延后计算“(lazy evaluation)特性。我们还讨论过在处理大规模排列数据集时,Stream可以一个一个把数据元素搬进内存并且可以逐个元素地进行处理操作。这让我不禁联想到我们常用的数据搜索读取方式了:大量的数据存放在数据库里... 阅读全文
posted @ 2015-03-19 12:12 雪川大虫 阅读(1593) 评论(0) 推荐(1)
摘要:在前面的章节中我们介绍了List,也讨论了List的数据结构和操作函数。List这个东西从外表看上去挺美,但在现实中使用起来却可能很不实在。为什么?有两方面:其一,我们可以发现所有List的操作都是在内存中进行的,要求List中的所有元素都必须在操作时存在于内存里。如果必须针对大型数据集进行Lis... 阅读全文
posted @ 2015-03-17 21:36 雪川大虫 阅读(1516) 评论(1) 推荐(1)
摘要:延后计算(lazy evaluation)是指将一个表达式的值计算向后拖延直到这个表达式真正被使用的时候。在讨论lazy-evaluation之前,先对泛函编程中比较特别的一个语言属性”计算时机“(strict-ness)做些介绍。strict-ness是指系统对一个表达式计算值的时间点模式:即... 阅读全文
posted @ 2015-03-16 09:29 雪川大虫 阅读(3114) 评论(0) 推荐(0)
摘要:上节我们介绍了新的数据类型Option:一个专门对付异常情况出现时可以有一致反应所使用的数据类型。Option可以使编程人员不必理会出现异常后应该如何处理结果,他只是获得了一个None值,但这个None值与他所期待的类型是一致的,他可以继续用处理这种类型数据的方法使用这个结果。不过遗憾的是我们通... 阅读全文
posted @ 2015-03-15 11:28 雪川大虫 阅读(1357) 评论(1) 推荐(0)
摘要:Option是一种新的数据类型。形象的来描述:Option就是一种特殊的List,都是把数据放在一个管子里;然后在管子内部对数据进行各种操作。所以Option的数据操作与List很相似。不同的是Option的管子内最多只能存放一个元素,在这个方面Option的数据操作就比List简单的多,因为使... 阅读全文
posted @ 2015-03-14 00:12 雪川大虫 阅读(1920) 评论(1) 推荐(0)
摘要:上节介绍了泛函数据结构List及相关的泛函编程函数设计使用,还附带了少许多态类型(Polymorphic Type)及变形(Type Variance)的介绍。有关Polymorphism的详细介绍会放在typeclass讨论中。为了更多了解泛函数据结构(Functional Data Stru... 阅读全文
posted @ 2015-03-12 12:14 雪川大虫 阅读(1380) 评论(3) 推荐(1)
摘要:泛函编程和数学方程式解题相似;用某种方式找出问题的答案。泛函编程通用的方式包括了模式匹配(pattern matching)以及递归思维(Recursive thinking)。我们先体验一下:(在阅读本系列博客文章之前,相信读者已经对Scala语言及REPL用法有所了解了。在这就不去解释Scal... 阅读全文
posted @ 2015-03-12 08:28 雪川大虫 阅读(1554) 评论(0) 推荐(2)
摘要:折叠算法是List的典型算法。通过折叠算法可以实现众多函数组合(function composition)。所以折叠算法也是泛函编程里的基本组件(function combinator)。了解折叠算法的原理对了解泛函组合有着至关紧要的帮助。折叠算法又可分右折叠和左折叠。我们先从右折叠(foldR... 阅读全文
posted @ 2015-03-11 18:54 雪川大虫 阅读(2870) 评论(2) 推荐(2)