Scala 函数式编程原理 第四课(Conditions and Value Definitions)

     到目前为止,我们学的Scala语法层面的东西还很少,基本上我们所学的都是“函数”和“函数式的程序“等概念。接下来,我们将介绍一些语法先关的东西。

    几乎每一种计算机语言,都会有二选一的选择语句,在Scala中是"if-else"(大部分语言都是if-else),它看起来很像Java中的 "if-else"语句,但是其实不然,在Scala中,“if-else”语句是表达式,而不是声明(statement)。接下来你将会看到一个例子,以便帮你了解两者的区别:

 Example:

def abs(x:Int) = if(x >= 0) x else -x


其中, x >= 0 是一个判断语句,不是true就是false。
以上例子,定义一个函数:abs,如果参数大于等于零,就是x,其他的,就是x的反数:-x。这就是一个“表达式”它是有值的,不像Java中的“声明”(statement)一样,需要定义变量,然后给变量赋值,最后通过运算用返回语句返回值。而且,这里的“x >= 0”也是一个返回值是的布尔类型的表达式!这种表达式我们叫它“predicates”---断言,和unit test中的断言(assert)还不是一回事儿,这里的断言是一个值。


因此,布尔类型的表达式的形成基本上和Java的方式一样;因此,你可以也能够写“true”或者“false”来作为一个布尔类型的常量,如上图的第一行所示。"b"的否定可以写为“!b”,如图第二行;“与”可以写为“&&”,如图第三行;“或”可以写为“||”,如图第四行。并且,在Java中可以使用的比较运算符,例如:小于等于“<=”、大于等于“>=”、小于“<”、大于“>”、等于“==”、不等于“!=”等等只要在Java中合法可用,那么你就可以认为在Scala中也可用。


到目前为止,我们学习了表达式的形成,但是他们表达的意思是什么呢?上图给出了Boolean 表达式的简化规则,其中e是一个任意的表达式。

图的左边是原形,右边是可以简化的结果,但凡是有点Java编程经验的就可以很清楚的看懂。

注意:“&&” 或者 “||”有时候无需求e的值,例如第四条和第五条。我们称这种表达式为“short-circuit evaluation” (中文为“短路求值”?)。

现在我们可以用简化的方式来表达一个表达式了;以上的内容可能有人觉得说和Java的是一样的,对的确实就这么解决的;但是现在我们有一种简洁的、基本上可以称之为规范的模式来解决这种问题,当遇到类似的情况的时候的时候。下面我们开始讲讲遇到时候如何解决:

有一个if-else语句:

if (e) e1 else e2

if(true) e1 esle e2  => e1

if (false) e1 else e2 => e2

以上是两个例子。

还有另外一个新的语法---- Value Defintions。

我们已经知道,函数的参数可以是“call by value”或者是或者是“call by name”的。

两者的区别取决于定义。

"def"形式从某种意义上讲是“call by name”,因为右边内容是在每次用的时候才会被求值。

也有一些"val"形式的“call by value”的内容,例如:

val x = 2

val y = square(x)

右边的内容square(x)在定义自己的时候就被求值了,而不是再我们第一次使用“y”将其链接的时候。因此,在我们的案例中,“y”引用指向的会是数字“4”,而不是表达式“square(x)”。


“val”和“def”的不同是在右边不是一个终止语句而是一个循环的时候体现出来的。

首先让我们打开"REPL",然后做一些操作,首先定义一个loop;


如果定义“def x = loop”,将不发生任何事情。


但是,如果输入 "val x = loop ",REPL就卡死在那儿了,直到输入“Ctrl + C”才可以解脱。


因为定义“val x = loop"的时候,右边就会被求值,但是一求值,就死循环了。。

下面,我们做一个练习:


写一个 and (x, y) 和 or(x, y)的函数各一个,要求达到的效果是:and 的效果是“&&”,or的效果是“||”




答案:


我们输入 and(true,false) ,预想结果是false


REPL上输入,结果和预想的一致!

“true”或者“false”是唯一能输入的参数吗?当然不是,我们还可以输入表达式,我们输入and(true,loop)来试试!



卡死了!

我们该如何改正呢?是的,把 and的y 参数改为“call by name”的形式就行了,如下图:




猜你喜欢

转载自blog.csdn.net/i6448038/article/details/52059855
今日推荐