Motivation:
1 Spark很多代码都是scala写的,不学习scala,看起来实在云里雾里
2 Actor和AKKA模型,向往已久,自己的产品里面也有使用这些,但还无缘一窥究竟。为学习AKKA做准备。
Scala的使用环境设置参考
https://class.coursera.org/progfun-004/wiki/ToolsSetup
1 REPL
read eval print loop, 其实就是控制台窗口,打开的方式有两种
i 在cmd中直接使用scala命令
ii在cmd中使用sbt console命令
2 Evaluation
1 表达式 evaluation
例子
2 函数 Evaluation
函数
Evaluation
例子
Substitution Model
Termination
def loop:Int = loop
上面的这个函数就没法最终归结到一个value,是一个无限循环(因为这里是递归调用,所以要指明返回类型)
另外一种函数的Evaluation 模式
Call by Name 和 Call by Value
CBN通常意义上更容易terminate,相对于CBV,比如
def Xfun(x:Int, y:Int):Int = x
Xfun(3, loop)
上面的函数,CBN可以terminate,但是CBV却不可以。
Scala Evaluation Mode
Scala中默认使用CBV,虽然有的时候不会terminate,但是这种方式提供了很好的效率。有的时候需要显示的设置为CBN方式
def ConstantOne(X: Int, Y: => Int ) = 1
ConstantOne(2, loop) // 这里loop被设置为CBN,而且最终也不会用到,可以正常terminate。
3 条件判断
条件判断基本和Java兼容,因为毕竟scala是兼容Java的。
def abs(x: Int) = if x < 0 -x else x
val x = 3
val x = 3 + 3
val x = loop // 这里会造成无限循环,因为这里定义的时候,就会进行evaluate了,但是这样就导致了无限循环
def x = loop
val x = squre(3)
valu类型的是immutable的,而且最终的value是在定义一开始的位置就立刻进行evaluation的,val是典型的CBV,val在下面被引用的时候,直接饮用的是对应的值。
4 Square Root
这里,比较的时候绝对差,这样会造成,如果开放的是非常小的数值的话或者是非常大的数值,就会出现问题,
非常小:因为误差计算设置为0.001,有可能相对较大,比如给0.0000001开方。
非常大:因为计算机精度有限,比如1.01*10^60, 需要由63位的精度才能计算到可以停止计算的结果,但是精度有限,就造成了无限循环,计算不出结果。
递归:递归方法调用,需要指明返回值类型