Scala 函数式编程学习视频 -- 求值策略和终止
本视频继续讲了 CBN(Call By Name) 和 CBV(Call By Value),它们就是一种求值策略。一般的 Scala 是采用 call-by-value,当函数的参数是使用的
多数情况下我们只需用 CBV,这是标准选择,因为它效率高,一般函数的参数都会用到,不管是在进函数之前还是在函数中计算。
没怎么清楚 termination 终止讲的是什么。
本视频讲义:week1-3.pdf
http://v.youku.com/v_show/id_XNzg3MDYyMTgw.html 永久链接 https://yanbin.blog/scala-functional-programming-evaluation-strategies-termination/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
=> 来声明参数,就是 call-by-name, => 是 Lambda 用的符号,y 有点像是个函数参数。=> 就是告诉这个参数会采用 call-by-name。看个例子:def constOne(x: Int, y: => Int) =1 //函数返回一个常数,x, y 分别是 CBV, CBN上面的 constOne(x: Int, y: => Int) = 1 用 scalac 编译后再 javap -c 反编译看到的是:
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,所以很慢
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 永久链接 https://yanbin.blog/scala-functional-programming-evaluation-strategies-termination/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。