【问题标题】:Why print() has side effects?为什么 print() 有副作用?
【发布时间】:2015-11-26 05:29:33
【问题描述】:

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

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

【问题讨论】:

  • 我不会说这是一个“愚蠢”的问题,但对于 Stack Overflow 来说这也不是一个很好的问题,或者至少在你对你的定义更加严格之前不会(并且在在那一点上,我怀疑会留下很多问题)。
  • 我会说print() 改变标准输出。它绝对不会读任何东西。一般来说,“无副作用”的定义是一个函数接受一个输入,返回一个输出,并且不影响任何其他状态。

标签: scala functional-programming


【解决方案1】:

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

但是,正如您在终端中看到的那样,当您调用 print 时,会发生一些事情:屏幕上会打印一些文本。那是 not NOT-OPERATION,因此,print 有副作用。

【讨论】:

    【解决方案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
    }
    

    现在可以从用户的角度将这些行为视为等效的吗?

    【讨论】:

      【解决方案3】:

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

      LAUNCH ROCKETS 1,7,13
      

      现在,你会说打印LAUNCH ROCKETS 1,7,13 没有副作用吗?如果我告诉你 13 号火箭的目标是你家呢?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-15
        • 2012-07-30
        • 1970-01-01
        • 2010-12-20
        • 2011-02-27
        • 2013-02-13
        • 1970-01-01
        相关资源
        最近更新 更多