怎样学习Scala泛函编程

     确切来说应该是我打算怎么去学习Scala泛函编程。在网上找不到系统化完整的Scala泛函编程学习资料,只好把能找到的一些书籍、博客、演讲稿、论坛问答、技术说明等组织一下,希望能达到学习目的。关于Scala语言的教材在国内网上还是比较容易找到的;可以到Scala语言官方网站国内Scala社区网站这些地方去看看了解一下;深一点的参考一下在路上,里面包括了一些泛函编程的概念性内容。

   

学习编程语言除了语法语意之外还必须透彻了解编程语言的数据结构(data structure);数据结构在实际项目中的角色,如何应用、如何添加定制;试想想任何一个实际的应用程序没有Array、List、Buffer、String这些数据结构会怎样。泛函编程有一套自己的数据结构。与OOP数据结构不同的是FP数据结构是以数学理论为基础的,必须遵循特定的数学定律。由于Scala是OOP和FP的混合,学习Scala也可以掌握我们所熟悉的那些java data structure。但如果直接使用这些java data structure去做Scala项目开发,那不就等于又回到原路了吗,还费劲去学习Scala干嘛,花点时间把java搞的更精点不是更好吗。曾提到OOP可能无法有效地进行现代云应用系统开发,那么重点还是要学习掌握Scala的泛函编程部分。泛函编程有一套独特的数据结构管理和应用方法。Scalaz是一套完整的泛函数据结构库,是一套开源项目,在许多大型软件中都有使用。那么我的第一个目标就是在以后的编程能充分使用Scalaz,合理调用里面的数据结构(data structure)。不过Scalaz连学习资料甚至说明文档都没有,看来还必须从基本的泛函编程概念开始学习。

    Scala泛函编程学习过程大体分三个部分:

    1)学习泛函编程模式    

    2)了解掌握Scalaz   

    3)用Scala泛函编程实践开发数据平台项目中的各项子系统。

    

    在网上刨过了一大堆书籍和资料后,发现Paul Chiusano和Runar Bjarnason所著“Functional Programming In Scala”写的不错。内容组织的也比较合理;从FP概念到FP数据结构到泛函编程,并且是用Scala做的示范说明。

下面的Scala泛函编程学习部分就以这本书的结构为基础,再把其它零星分散的资料重新组织一下作为进一步的示范说明。 

时间: 2024-10-28 19:43:34

怎样学习Scala泛函编程的相关文章

实用的Scala泛函编程

  既然谈到实用编程,就应该不单止了解试试一个新的编程语言那么简单了,最好通过实际的开发项目实例来演示如何编程.心目中已经有了一些设想:想用Scala泛函编程搞一个开源的数据平台应用系统,也就是在云平台PaaS层对上一层后台的数据应用平台.想想当电子商务和云应用真正普及后将会出现一大批没有云应用软件开发能力的用户.将来真正的云服务提供商,单提供虚拟机租赁服务是远不足够的,如果能提供一个具备计算资源自动扩展收缩.支持多种数据库以及一套简单的后台系统配置脚本语言(DSL:Domain Specifi

scala泛函编程是怎样被选中的

      现在计算机技术发展现象是:无论硬件技术如何发展都满足不了软件需求:无论处理器变得能跑多快,都无法满足软件对计算能力的需要.按照摩尔定律(Moore's Law)处理器(CPU)每平方面积上包含的半导体晶体管数量每18个月将会增加一倍.发展到现在,所有CPU厂商都再也无法按照摩尔定律在一定面积上成倍增加半导体了,大家也都只能朝着增加CPU内核数量上努力了.多核CPU已然成为现代计算机技术发展趋势.现代软件对计算能力的需求暴增主要归咎于现代社会中数据应用的普及和泛滥.这种数据量级单凭增加

新一代编程:scala泛函编程技术-唠叨

   准备了半年后,终于决定在这里开始我的scala编程技术学习体验撰写之旅.初步打算在这里把我学习.体验.掌握scala编程的过程与有兴趣的朋友分享.我想,虽然我这不是正式论文或者教课书之类的,但写个开场白总是好的.以后都是技术性的表述了,还是把握最后机会唠叨一下吧...     刚好完成了一个行业云平台项目,决定暂停下来仔细思考一下下一步应该怎么走,是不是要改改方向?在之前的项目里,作为项目开发负责人,为了保证项目的成功率,必须完全依赖公司现有的技术.技能资源,绝不能轻易引进新的技术线路和手

泛函编程(4)-深入Scala函数类

既然是泛函编程,多了解一下函数自然是免不了的了: 方法(Method)不等于函数(Function) 方法不是函数但可以转化成函数:可以手工转换或者由编译器(compiler)在适当的情况下自动转换.反向转换则不然:函数是无法转换到方法的.先看看下面的例子: 1 scala> def aMethod(x: Int): Int = x + 10 2 aMethod: (x: Int)Int 3 4 scala> val aFunction = (x: Int) => x + 10 5 aF

泛函编程(27)-泛函编程模式-Monad Transformer

  经过了一段时间的学习,我们了解了一系列泛函数据类型.我们知道,在所有编程语言中,数据类型是支持软件编程的基础.同样,泛函数据类型Foldable,Monoid,Functor,Applicative,Traversable,Monad也是我们将来进入实际泛函编程的必需.在前面对这些数据类型的探讨中我们发现: 1.Monoid的主要用途是在进行折叠(Foldable)算法时对可折叠结构内元素进行函数施用(function application). 2.Functor可以对任何高阶数据类型F[

泛函编程(21)-泛函数据类型-Monoid

    Monoid是数学范畴理论(category theory)中的一个特殊范畴(category).不过我并没有打算花时间从范畴理论的角度去介绍Monoid,而是希望从一个程序员的角度去分析Monoid以及它在泛函编程里的作用.从这个思路出发我们很自然得出Monoid就是一种数据类型,或者是一种在泛函编程过程中经常会遇到的数据类型:当我们针对List或者loop进行一个数值的积累操作时我们就会使用到Monoid.实际上Monoid就是List[A] => A的抽象模型.好了,我们就不要越描

泛函编程(6)-数据结构-List基础

    List是一种最普通的泛函数据结构,比较直观,有良好的示范基础.List就像一个管子,里面可以装载一长条任何类型的东西.如需要对管子里的东西进行处理,则必须在管子内按直线顺序一个一个的来,这符合泛函编程的风格.与其它的泛函数据结构设计思路一样,设计List时先考虑List的两种状态:空或不为空两种类型.这两种类型可以用case class 来表现: 1 trait List[+A] {} 2 case class Cons[+A](head: A, tail: List[A]) exte

泛函编程(18)-泛函库设计-并行运算组件库

   作为专业的编程人员,我们经常会因为工作需要建立一些工具库.所谓工具库就是针对工作上经常会遇到的一些共性问题预先编制的由一整套函数所组成的函数库.通常这些工具库的功能都是在特别定制的一些数据类型支持下由一系列函数围绕着这些数据类型进行运算而实现的.在泛函编程范畴内也不例外.但在泛函工具库里的函数则更重视函数的组合能力(functional composition):因而泛函的工具库一般称为组件库(combinator library),库内函数则被称之为组件(combinator).组件库的

泛函编程(5)-数据结构(Functional Data Structures)

  编程即是编制对数据进行运算的过程.特殊的运算必须用特定的数据结构来支持有效运算.如果没有数据结构的支持,我们就只能为每条数据申明一个内存地址了,然后使用这些地址来操作这些数据,也就是我们熟悉的申明变量再对变量进行读写这个过程了.试想想如果没有数据结构,那我们要申明多少个变量呢.所以说,数据结构是任何编程不可缺少的元素.     泛函编程使用泛函数据结构(Functional Data Structure)来支持泛函程序.泛函数据结构的特点是"不可变特性"(Immutability)