为什么print()有副作用?

时间:2015-11-26 05:29:33

标签: scala functional-programming

为什么Scala中的print()方法有副作用?它只是阅读,而不是写。换句话说,print()不会改变任何东西。

我似乎是一个"愚蠢的"问题,但有时小事会导致大动作。

3 个答案:

答案 0 :(得分:6)

对函数没有副作用意味着可以用它的返回值替换对它的调用。 print不返回任何值,因此如果它是纯的(它没有副作用),它可以被NOT-OPERATION替换。

但是,正如您在终端中看到的,当您致电print时会发生某些事情:某些文字会在屏幕上打印出来。那是 NOT-OPERATION,因此,print会产生副作用。

答案 1 :(得分:2)

正如@lyjackal完美地说print()会改变System.out

例如这两个定义

def sumA = {
  val x = foo
  val y = bar
  val z = baz
  x + y + z
}


def sumB = {
  val x = foo
  val z = baz
  val y = bar
  x + y + z
}
如果foobar 没有副作用

应该相同

所以行

println(s"By the way your result is $sumA")

println(s"By the way your result is $sumB")

应该从技术和用户角度定义相同的行为

但考虑这些函数的定义

def foo = {
  println("Good to see you sir!")
  1
}

def bar = {
  println("I hate you")
  2
}

def baz = {
  println("Just joking")
  3
}

现在可以从用户角度看这些行为是否相同?

答案 2 :(得分:0)

该程序的输出可以连接到火箭发射器,火箭发射器了解以下命令:

LAUNCH ROCKETS 1,7,13

现在,你会说打印LAUNCH ROCKETS 1,7,13没有副作用吗?如果我告诉你火箭13是针对你的房子怎么办?