Scala 函数式编程学习视频 -- 求值策略和终止

本视频继续讲了 CBN(Call By Name) 和 CBV(Call By Value),它们就是一种求值策略。一般的 Scala 是采用 call-by-value,当函数的参数是使用的 => 来声明参数,就是 call-by-name, => 是 Lambda 用的符号,y 有点像是个函数参数。=> 就是告诉这个参数会采用 call-by-name。看个例子:

def constOne(x: Int, y: => Int) =1 //函数返回一个常数,x, y 分别是 CBV, CBN
constOne(23, (1 to 1000000000).foldLeft(0){(a,b)=>a+b}) //CBN, 把 foldLeft 表达式传给 constOne,希望在 constOne 中计算,所以很快
constOne((1 to 1000000000).foldLeft(0){(a,b)=>a+b}, 23) //CBV, 计算出 foldLeft 后值传给 constOne,所以很慢

上面的 constOne(x: Int, y: => Int) = 1 用 scalac 编译后再 javap -c 反编译看到的是:

public int constOne(int, scala.Function0<java.lang.Object>);
Code:
0: iconst_1
1: ireturn

阅读全文 >>

Java 解析 XML 时如何屏蔽掉 “[Fatal Error]” 的输出

我们在用 Java 解析 XML,当文档不是一个合法的 XML 时,可能会收到 [Fatal Error] 的控制台输出,即使把整个代码都 catch 住,仍然不能抑制住 [Fatal Error] 的信息输出。比如常见到这样的输出:

[Fatal Error] :1:1: Content is not allowed in prolog.

为什么不能禁掉它呢,本来 catch 了异常对程序已经有了很好的保护,想眼不见心不烦,但还是避之不及。

因为,因为这个 XML 解析器用 System.error.print() 输出来了,当然你可以用 System.setErr(PrintStream) 重定向掉错误输出,但不现实,波及面太大。我们需要找到源头,首先交代解决方案就是覆盖掉默认的 ErrorHandler。

看下这段 XML 解析代码: 阅读全文 >>

Scala 函数式编程学习视频 -- 编程元素

进到 Scala 的 REPL (Read-Eval-Print-Loop) 有两种方式,scala 或 sbt console。函数式的任务就是求值(reduction steps),Scala 把表达式和方法进行了统一,Scala 的变量和函数也应作一致性思考。Substitution Model, no side effects, λ-calculus -> immutable。 Call-by-name vs call-by-value ,是调用者还是被调用者来对参数求值的问题。val 定义值时,会做 call-by-value 操作,def 则会做 call-by-name 操作,或者可以说是静态与动态求值。

Scala Call-By-Name vs Call-By-Value

要指定函数参数 y 以 Call-By-Name 传递,要这么定义 def test(x: Int, y: => Int) = x * x,这样就避免了 test(3, 2*4) 调用时 2*4 被求值,这里把 y 转换成了函数参数 y: => Int

阅读全文 >>

Scala 函数式编程学习视频 -- 编程范式

开始真正进入 Scala 编程的世界。

范式是一个比较抽象的概念,可以理解规范和模式,此视频让我们了解编程语言范式分类。我们原来接触过指令式,过程式及一直广泛应用的面向对象式编程,面向方面不算数。Scala 让我们进入到了函数式编程,不像 Haskell, Scala 把面向对象与函数式编程很多的连接了起来。进到 Scala 的世界,一定要时常性的用函数式编程思维武装自己的头脑,并且在多核的时代尽可能的 Immutable

有狭义和广义函数式编程语言之分,狭义函数式没有变量,没有赋值操作,没有循环等指令式控制结构--代表用 Pure List, XSLT 等;广义函数式更宽松,尽量用 immutable, 函数是第一等公民,像 Scala, Clojure 等。

阅读全文 >>

Scala 函数式编程学习视频 -- 总目

Coursera 上的 Functional Programming Principle in Scala 视频教程,合成了英文字幕,应该没有多大必要性翻译成中文字幕,本人觉得大家的英语都比我强,因为它是我永久的,历史的伤口。

该课程共有七周的课时,算下来每天十至二十多分钟的时间。

开始教程

第一周:函数和求值 阅读全文 >>

Scala 函数式编程学习视频 -- 指导: 编程作业

基本上每个阶段过后都有一个不小的练习,本视频告诉我们怎么下载练习并导入到 Scala IDE,可在 SBT 下提交代码,不在 Cousera 上学习的话,也没法提交。可以从这里把那几个练习下载过来试试身手。

有兴趣的同学可以从下面的链接下载红练习项目:

example   recfun   funsets  objsets   patmat  forcomp  streams

阅读全文 >>

Scala 函数式编程学习视频 -- Windows 下工具设置

Windows 无疑还是最大众化的个人操作系统了,很少很少人在 Windows 下用 Open-JDK。

本视频示例了在 Windows 下 JDK, SBT 的安装,需要设置相关的 PATH 环境变量。以及下载安接 Scala SDK IDE (集成了 Scala SDK, Scala 插件的 Eclipse,这样就不用单独安装那三个玩意儿)。

接着在 Scala IDE 中演示了 Scala HelloWorld 程序,最后就是 Scala WorkSheet,比 Scala 命令行下的 REPL 更强大的交互式工具,比 Swift 还早的 Playground. 阅读全文 >>

Scala 函数式编程学习视频 -- Mac OS X 下工具设置

随着苹果在 iPhone, iPad 以及 Apple Watch 上的造势,Mac OS X 也越来越流行起来。我们公司最近购置了不少的 Mac 设备,本人在 Apple 平台上工作已有三年了,对 Windows 系统感觉陌生了。

本视频示例了在 Mac OS X 下的 JDK, SBT 安装,一般 Mac OS X 随机安装了 JDK,若没有的话执行 java -version 会带领你安装 JDK。需要设置 SBT 的 PATH。以及如何下载安接 Scala SDK IDE (集成了 Scala SDK, Scala 插件的 Eclipse,这样就不用单独安装那三个玩意儿)。

如果想要安装更高版本的 JDK 也是要到 Oracle 去下载,还需设置新 JDK bin PATH 覆盖现有的。

接着在 Scala IDE 中演示了 Scala HelloWorld 程序,最后就是 Scala WorkSheet,比 Scala 命令行下的 REPL 更强大的交互式工具,比 Swift 还早的 Playground.

阅读全文 >>

Scala 函数式编程学习视频 -- Linux 下工具设置

不清楚现在用 Linux 桌面做编程的有多少了,主要由 Ubuntu 和  RedHat 来支撑了。Mac OS X 倒是越发流行起来。

本视频示例了在 Ubuntu 上安装 JDK, SBT -- 下载,解压,设置 PATH 的过程。以及如何下载安接 Scala SDK IDE (集成了 Scala SDK, Scala 插件的 Eclipse,这样就不用单独安装那三个玩意儿)。

接着在 Scala IDE 中演示了 Scala HelloWorld 程序,最后就是 Scala WorkSheet,比 Scala 命令行下的 REPL 更强大的交互式工具,比 Swift 还早的 Playground.

阅读全文 >>

Scala 函数式编程学习视频 -- 课程介绍

Functional Programming Principles in Scala 课程介绍及课程安排,视频中会提些小问题,会在后面的视频中看到答案。其后三个视频将会涉及到 Scala 环境的设置,包括 Windows, Mac OS X 和 Linux 下的工具设置。我们将接触到 SBT(Simple Build Tool),其实是名不符实,SBT 是我用过最不简单的构建工具。我也觉得 SBT 叫做 Scala Build Tool 才合适,可以选择 Gradle,不过本课程是用 SBT。IDE 的话基本就是 Eclipse, IDEA 二分天下。

挂上了英文字幕,你要在官方学完这套课程还能得到一个认证,形式而已。

阅读全文 >>