![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
【Scala Programming】
文章平均质量分 91
JasonDing1354
关注jasonding.top
展开
-
【Scala】Scala函数式编程初探
函数式编程函数式编程是种编程典范,它将电脑运算视为函数的计算。函数编程语言最重要的基础是 λ 演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。和指令式编程相比,函数式编程强调函数的计算比指令的执行重要。和过程化编程相比,函数式编程里,函数的计算可随时调用。 命令式编程是面向计算机硬件的抽象,有变量(对应着存储单元),赋值语句(获取,存储指令),原创 2015-05-26 16:34:16 · 1556 阅读 · 0 评论 -
【函数式】Monads模式初探——Monad概念
单子单子(Monad)是一种将函子组合应用的方法。在计算机科学里,单子经常用来代表计算(computation)。单子能用来把与业务无关的通用程序行为抽象出来,比如有用来处理并行(Future)、异常(Option和Try等)、甚至副作用的单子。 单子的flatMap和unit操作作为构建数据类型的基本操作,可以实现很多复杂的高阶函数。单子的程序描述Monad定义了unit和flatMap两个函数原创 2016-03-05 21:14:00 · 10796 阅读 · 0 评论 -
【函数式】Monads模式初探——Option Monad
Option MonadScala中的Option是一个Monad实现。 Option的简化版定义如下:sealed abstract class Option[+A] { def isEmpty: Boolean def get: A def map[B](f: A => B): Option[B] = if(isEmpty) None else Some(f(this.get)原创 2016-03-05 21:14:51 · 3104 阅读 · 0 评论 -
【Scala类型系统】自身类型(self type)引用
定义特质可以要求混入它的类扩展自另一个类型,但是当使用自身类型(self type)的声明来定义特质时(this: ClassName =>),这样的特质只能被混入给定类型的子类当中。 如果尝试将该特质混入不符合自身类型所要求的类时,就会报错。从技术角度上看,自身类型是在类中提到this时,对于this的假设性类型。从实用角度上看,自身类型指定了对于特质能够混入的具体类的需求。如果你的特质仅用于混原创 2016-03-17 22:38:01 · 6266 阅读 · 0 评论 -
【函数式】Monads模式初探——for解析式
for表达式是monad语法糖先看一组示例:case class Person(name: String, isMale: Boolean, children: Person*)val lara = Person("Lara", false)val bob = Person("Bob", true)val julie = Person("Julie", false, lara, bob)val原创 2016-03-05 21:15:41 · 3529 阅读 · 0 评论 -
【Scala-ML】如何利用Scala构建并行机器学习系统
引言在学习Scala的过程中,我发现其在构建大规模分布式计算系统上有与生俱来的特质。其丰富的类型系统可以帮助编程设计提供很好的信息隐藏和抽象,其monoids和monads概念利用Scala高阶函数实现计算并行和数据处理流水线,其Actor系统帮助编写可伸缩性的应用程序,其实现特定领域语言的优势帮助开发用户很好克服不同语言的障碍。 虽然以上Scala优点说起来不会感同身受,但这可以作为我学习的一大原创 2016-03-19 20:33:35 · 6355 阅读 · 0 评论 -
【Scala-ML】使用Scala构建机器学习工作流
引言在这一小节中,我将介绍基于数据(函数式)的方法来构建数据应用。这里会介绍monadic设计来创建动态工作流,利用依赖注入这样的高级函数式特性来构建轻便的计算工作流。建模过程在统计学和概率论中,一个模型通过描述从一个系统中观察到的数据来表达任何形式的不确定性,模型使得我们可以用来推断规则,进行预测,从数据中学习有用的东西。 对于有经验的Scala程序员而言,模型常常和monoid联系起来。mon原创 2016-03-19 20:34:19 · 6754 阅读 · 1 评论 -
【Scala】抽取器
引子由于样本类和构造器模式相关联,所以在模式匹配中常使用样本类做数据的解构和分析。 有些情况下,或许希望能够在不创建关联的样本类的前提下编写出类似的模式匹配,此时抽取器(Extractor)可以用来定义与对象表达解耦的模式。抽取email地址的例子问题假设你需要分析一些代表email地址的字符串:对于给定的字符串,首先要判断它是否为email地址,如果是,再分析访问地址的用户名和域名。 def原创 2016-03-10 17:12:54 · 4745 阅读 · 2 评论 -
【Scala】Cake模式和依赖注入
依赖注入(Dependency Injection)和控制反转(Inversion of Control)Dependency Injection & Inversion of Control是Martin Fowler在2004年所提出來的一个概念,Martin Fowler在这篇文章中指出,DI可以有三种形式来实现。这观念以后有Spring项目和Google实现出来,变成了Java Enterp原创 2016-03-11 22:06:27 · 5122 阅读 · 1 评论 -
【Scala类型系统】类型参数化和变化型注解
引言类型参数化(Parameterized Types)可以用来编写泛型类和特质,比如定义Set[T],这使得我们可以创建诸如Set[String]的类型。而变化型注解(Variance Annotation)定义了参数化类型的继承关系,比如Set[String]是Set[AnyRef]的子类型。 这些语法可以让我们实现信息隐藏技术,同时它们也是编写库程序的基础。类型参数化这里以水果盒的代码作为例原创 2016-02-27 21:33:32 · 4448 阅读 · 0 评论 -
【Scala类型系统】函数式Queue的简易实现
实现一个函数式Queue泛型类函数式队列是一种具有以下三种操作方式的数据结构: head 返回队列的第一个元素 tail 返回除第一个元素之外的队列 append 返回尾部添加了指定元素的新队列如果Queue是一个不变队列,也就是函数式队列。在添加元素的时候不会改变其内容,而是返回包含了这个元素的新队列。 如果Queue是可变类型的,那么append操作将改变队列的内容原创 2016-02-27 21:34:38 · 3125 阅读 · 0 评论 -
【Scala类型系统】隐式转换与隐式参数
隐式转换隐式转换是使用implicit修饰的带有单个参数的普通函数。这种函数将自动应用,将值从一种类型转换为另一种类型。 举例说明: 我们想将整数n转换为分数n/1, 定义implicit def int2Fraction(n: Int) = Fraction(n, 1) 在进行如下表达式求值的时候: val result = 3 * Fraction(4, 5) 编译原创 2016-02-27 21:35:31 · 3197 阅读 · 0 评论 -
【函数式】Monads模式初探——Monoids
Monads是什么知乎里有关于什么是Monad的问题讨论,而在维基百科中也有关于Monad的释义。作为初次接触到Monads概念,难免会有些晕头转向,也难免会有些畏惧(因为Monads和数学中的范畴论有密切关系),但是Monads又是如此的重要,因为它在函数式编程中实在是应用太广泛了,并且在Scala的标准库中又常常遇到,使得我们不得不好好研究一番。MonoidsMonoids是一种元素的集合,它需原创 2016-02-28 21:36:14 · 5215 阅读 · 2 评论 -
【函数式】Monads模式初探——Functor
函子与范畴函子(functor)是从一个范畴到另一个范畴的转换,并且其亦可转换/保持态射(morphism)。 一个态射是从一个范畴里的一个值到同一个范畴里的另一个值的变换。在猫的范畴的例子里,一个态射好比一个盒子,能够把黯淡无光的猫转化为一个霓虹闪耀的猫。在类型的范畴里(计算机科学常用的范畴),一个态射是一个把某类型转化为另一个类型的函数。 函子是可以把猫转化为狗的东西(不同范畴的转换)。函子原创 2016-02-29 21:33:18 · 3655 阅读 · 0 评论 -
【函数式】Monads模式初探——Endofunctor
自函子自函子(Endofunctor)是一个将范畴映射到自身的函子(A functor that maps a category to itself)。函子是将一个范畴转换到另一个范畴,所以自函子是一种特殊的函子。 由三部分组成: 一组元素对象 一组态射 态射组合(二元运算) 如果这个范畴满足结合律,那么它是一个半群;如果半群满足幺元(单位元,identity),那么它是幺原创 2016-03-01 10:53:28 · 3499 阅读 · 0 评论 -
【函数式】纯函数与替代模型
纯函数一个函数在程序执行的过程中除了根据输入参数给出运算结果之外没有其他的副作用影响,我们可以把这类函数称为“纯函数”。纯函数由于不依赖外部变量,使得给定函数输入其返回结果永远不变,比如整数的加法函数,它接收两个整数值并返回一个整数值,对于给定的两个整数值,它的返回值永远是相同的整数值。副作用相对于非纯函数,它们带有副作用,这使得函数不仅简单返回一个值,还做了其他事情: 修改了一个变量原创 2016-05-27 11:07:10 · 4801 阅读 · 1 评论 -
【Akka】Akka中actor的生命周期与DeathWatch监控
Actor的生命周期在Actor系统中的路径代表一个“地方”,这可能被一个存活着的的actor占用着。最初,路径(除了系统初始化角色)是空的。当actorOf()被调用时,指定一个由通过Props描述给定的路径角色的化身。一个actor化身由路径和一个UID确定。重新启动仅仅交换Props定义的Actor 实例,但化身与UID依然是相同的。 当该actor停止时,化身的生命周期也相应结束了。在这一原创 2016-01-19 11:34:43 · 3040 阅读 · 0 评论 -
【Akka】Actor引用
Actor系统的实体在Actor系统中,actor之间具有树形的监管结构,并且actor可以跨多个网络节点进行透明通信。 对于一个Actor而言,其源码中存在Actor,ActorContext,ActorRef等多个概念,它们都是为了描述Actor对象而进行的不同层面的抽象。 我们先给出一个官方的示例图,再对各个概念进行解释。 上图很清晰的展示了一个actor在源码层面的不同抽象,和不同原创 2016-01-18 17:29:49 · 4221 阅读 · 0 评论 -
【Scala】模式匹配和样本类
模式匹配要理解模式匹配(pattern-matching),先把这两个单词拆开,先理解什么是模式(pattern),这里所的模式是数据结构上的,这个模式用于描述一个结构的组成。我们很容易联想到“正则表达”里的模式,不错,这个pattern和正则里的pattern相似,不过适用范围更广,可以针对各种类型的数据结构,不像正则表达只是针对字符串。比如正则表达式里 “^A.*” 这个pattern 表示以A原创 2015-06-21 15:20:11 · 3146 阅读 · 0 评论 -
【Scala编程】格式化算术表达式程序
格式化算术表达式程序为了练习模式匹配的使用,该博文介绍编写格式化算术表达式的程序,最终的呈现结果如下面这个二维布局的数学表达式所示,这里除法运算被垂直打印出来:1 - * (x + 1)2 ----------- x 1.5 - + --- 2 x 为了实现这个程序,我们需要做一下工作:1. 编写一个二维布局库来创建和渲染二原创 2015-06-28 21:54:21 · 2089 阅读 · 0 评论 -
【Scala】Scala的Predef对象
隐式引用(Implicit Import)Scala会自动为每个程序加上几个隐式引用,就像Java程序会自动加上java.lang包一样。Scala中,以下三个包的内容会隐式引用到每个程序上。所不同的是,Scala还会隐式加进对Predef的引用,这极大方便了程序员的工作。import java.lang._ // in JVM projects, or system namespace in .N原创 2015-06-30 15:45:03 · 1953 阅读 · 0 评论 -
【Scala】使用Option、Either和Try处理数据交互
Scala数据交互Scala使用一种函数式的方式来处理数据交互,包括入参及返回值。 Option: 解决null(空指针)问题 Either: 解决返回值不确定(返回两个值的其中一个)问题 Try: 解决函数可能会抛出异常问题 Option/Some/None的使用Option实际上有3个类型:Option、Some和None,Some和None都是Option的子类型,So原创 2015-07-09 22:08:47 · 5520 阅读 · 1 评论 -
【Scala】Scala的类层级
Scala的类层级Scala里,每个类都继承自通用的名为Any的超类。因为所有的类都是Any的子类,所以定义在Any中的方法就是“共同的”方法:它们可以被任何对象调用。Scala还在层级的底端定义了一些类,如Null和Nothing,扮演通用的子类。即,Any是所有其他类的超类,Nothing是所有其他类的子类。Any类层级的顶端是Any类,定义了下列方法:final def ==(that: An原创 2015-06-15 20:28:30 · 2729 阅读 · 0 评论 -
【Scala】特质与特质的线性化
特质Scala里相当于Java接口的是Trait(特征)。实际上它比接口还功能强大。与接口不同的是,它还可以定义属性和方法的实现。Scala中特征被用于服务于单一目的功能模块的模块化中。通过混合这种特征(模块)群来实现各种应用程序的功能要求,Scala也是按照这个构想来设计的。特质的构造顺序特质也可以有构造器,由字段的初始化和其他特质体中的语句构成。这些语句在任何混入该特质的对象在构造时都会被执行。原创 2015-06-15 20:29:15 · 2222 阅读 · 0 评论 -
【Scala】头等函数与函数即对象
头等函数Scala的函数是头等函数(first-class function)。你不仅可以定义和调用函数,还可以把它们写成匿名的字面量(literal),并把它们作为值传递。 函数字面量被编译进类,并在运行期实例化为函数值(function value)。什么意思呢?函数的本质是类的实例。函数是一些特质的集合,任何函数值都是某个扩展了scala包的若干FunctionN特质之一的类的实例,如Fun原创 2015-06-15 20:26:57 · 2424 阅读 · 0 评论 -
【Scala】单例对象与伴生对象
Scala的单例对象Scala不能定义静态成员,而是代之定义单例对象(singleton object)。以object关键字定义。 对象定义了某个类的单个实例,包含了你想要的特性:object Accounts{ private var lastNumber = 0 def newUniqueNumber() = { lastNumber += 1; lastNumber}}原创 2015-06-15 20:25:36 · 8563 阅读 · 0 评论 -
【Scala】高阶函数和柯里化
高阶函数在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:- 接受一个或多个函数作为输入- 输出一个函数在数学中它们也叫做算子(运算符)或泛函。微积分中的导数就是常见的例子,因为它映射一个函数到另一个函数。高阶函数的例子假设有一个函数对给定两个数区间中的所有整数求和:def sumInts(a: Int, b: Int): Int = if(a > b) 0 else a + s原创 2015-06-15 20:27:44 · 2513 阅读 · 0 评论 -
【Scala】Scala中的Nothing,Null,None,Nil
NothingNothing是所有类型的子类,也是Null的子类。Nothing没有对象,但是可以用来定义类型。例如,如果一个方法抛出异常,则异常的返回值类型就是Nothing(虽然不会返回) 。 def get(index:Int):Int = { if(x < 0) throw new Exception(...) else ....}if语句是表达式,有返回值,必然有返回值原创 2015-07-07 14:12:04 · 4483 阅读 · 0 评论 -
【Scala】使用Option、Some、None,避免使用null
避免null使用大多数语言都有一个特殊的关键字或者对象来表示一个对象引用的是“无”,在Java,它是null。在Java 里,null 是一个关键字,不是一个对象,所以对它调用任何方法都是非法的。但是这对语言设计者来说是一件令人疑惑的选择。为什么要在程序员希望返回一个对象的时候返回一个关键字呢?Scala的Option类型为了让所有东西都是对象的目标更加一致,也为了遵循函数式编程的习惯,Scala鼓原创 2015-07-07 14:13:33 · 28166 阅读 · 0 评论 -
【Scala】尾递归优化
以递归方式思考递归通过灵巧的函数定义,告诉计算机做什么。在函数式编程中,随处可见递归思想的运用。 下面给出几个递归函数的例子:object RecursiveExample extends App{ // 数列求和例子 def sum(xs: List[Int]): Int = if (xs.isEmpty) 1 else xs.head + sum原创 2016-01-15 20:30:08 · 5813 阅读 · 0 评论 -
【Akka】在并发程序中使用Future
引言在Akka中, 一个Future是用来获取某个并发操作的结果的数据结构。这个操作通常是由Actor执行或由Dispatcher直接执行的. 这个结果可以以同步(阻塞)或异步(非阻塞)的方式访问。 Future提供了一种简单的方式来执行并行算法。Future直接使用Future中的一个常见用例是在不需要使用Actor的情况下并发地执行计算。 Future有两种使用方式: 阻塞方式(B原创 2016-01-21 15:08:36 · 8012 阅读 · 2 评论 -
【Akka】Actor模型探索
Akka是什么Akka就是为了改变编写高容错性和强可扩展性的并发程序而生的。通过使用Actor模型我们提升了抽象级别,为构建正确的可扩展并发应用提供了一个更好的平台。在容错性方面我们采取了“let it crash”(让它崩溃)模型,人们已经将这种模型用在了电信行业,构建出“自愈合”的应用和永不停机的系统,取得了巨大成功。Actor还为透明的分布式系统以及真正的可扩展高容错应用的基础进行了抽象。Ak原创 2016-01-21 15:15:52 · 5886 阅读 · 0 评论 -
【Akka】Akka入门编程实例
引言这篇文章主要是第一次学习Akka编程,先试试水,探探坑,对Akka和SBT的使用有一个直观的了解,以几个简单的akka编程实例来说明akka的使用。希望在日后的学习和编程中,能有更多自己的体会和经验总结来分享。Actor模型Actor实例可以想象成是服务器上的Web服务,你无法控制,只能通过发送消息去请求执行任务或查询信息,而不能直接在Web服务中修改状态或者处理资源。通过发送不可改变的消息,虽原创 2016-01-17 19:26:16 · 6357 阅读 · 2 评论 -
【Scala编程】函数式风格编写排序算法
有关Scala编程实例在刚开始学习一门编程语言的时候,总是想去写一些比较大的程序和项目,但是由于基础不扎实,往往欲速则不达。所以,只能一步一步来,通过一些经典的小例子来实践和锻炼,最终不断加深编程的技能,坚持下来,相信慢慢就能够变得熟练。冒泡排序、选择排序、插入排序的一般写法这三种排序方法没有太多要说的东西,这里的编程方式和指定式方式没什么差别。 这里之所以使用Array数据,因为Array数组是原创 2015-06-22 21:14:41 · 2708 阅读 · 2 评论 -
【Scala】响应式编程思想
何为响应式编程响应式编程是一种面向数据流和变化传播的编程范式,数据更新是相关联的。 这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。 以响应式编程方式进行思考,意味着要放弃命令式且带状态的编程习惯,并且强迫你的大脑以一种不同的方式去工作。 响应式编程提高了代码的抽象层级,所以你可以只关注定义了业务逻辑的那些相互依赖的事件,而非纠缠于大量原创 2016-05-15 19:47:31 · 4312 阅读 · 0 评论