函数的副作用是指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响。当函数返回值为空而只是就地修改数据时会产生副作用:1.非纯函数(impure function)2.违反了引用透明原则(referentially transparent)。下面是把一个有副作用的函数改为没有副作用的函数的例子。
假设我们要把命令行参数打印出来可以编写如下函数:
[java]view plaincopy
- def printArgs(args: Array[String]): Unit = {
- for (arg <- args)
- println(arg)
- }
或者
[java]view plaincopy
- def printArgs(args: Array[String]): Unit = {
- args.foreach(println)
- }
但是以上两个函数都是有副作用的,因为它们的返回值都是Unit类型。在scala语言中,如果函数不返回任何有用的值,我们就说其结果类型是Unit。
一种无副作用的实现应该是定义对需打印的arg进行格式化的方法,但是仅返回格式化之后的字串。
代码如下:
[java]view plaincopy
- def formatArgs(args: Array[String]) = args.mkString("\n")
在这种情况下,
1.formatArgs是纯函数。纯函数具有两条性质 1)函数不会改变函数以外的任何变量或任何类型的数据。2)在提供同一组输入数据的情况下,它将始终返回相同的返回值。纯函数没有任何潜在的副作用。
2.formatArgs符合引用透明原则。我们使用一个例子说明这一点,比如:
[java]view plain