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

多数情况下我们只需用 CBV,这是标准选择,因为它效率高,一般函数的参数都会用到,不管是在进函数之前还是在函数中计算。

没怎么清楚 termination 终止讲的是什么。

本视频讲义:week1-3.pdf

http://v.youku.com/v_show/id_XNzg3MDYyMTgw.html

类别: Scala. 标签: , . 阅读(113). 订阅评论. TrackBack.

Leave a Reply

Be the First to Comment!

avatar
wpDiscuz