这是Scala中的纯函数吗?

blu*_*sky 5 functional-programming scala

下面的函数getRandomString从字符列表中生成一个随机字符串:

  def genRandomInt(lb: Int, ub: Int) = {
    val rnd = new scala.util.Random
    lb + rnd.nextInt(ub)
  }     
  def getRandomString(validChars: List[Char]) = {

    val size = validChars.size

    val random = new scala.util.Random
    val stringBuilder = new StringBuilder
    val rnd = genRandomInt(0, size)
    val sb = new StringBuilder

    for (i <- 0 to size - 1) {
      val rnd = genRandomInt(0, size)
      sb.append(validChars(rnd))
    }

    sb.toString
  }                                               //> getRandomString: (validChars: List[Char])String

    val rs = getRandomString(('a' to 'j').toList)
                                                  //> rs  : String = aghdjjhjge
Run Code Online (Sandbox Code Playgroud)

getRandomString一个纯函数的例子,因为它不修改状态?

lmm*_*lmm 8

不,因为它实际上确实修改了状态.new scala.util.Random最终调用new java.util.Random,访问和修改一个静态(即全局),可变的AtomicLong被调用seedUniquifier.因此,如果多次调用此方法,则结果将发生变化.

这是一个很好的例子,说明无辜的看似方法如何隐藏对全局可变状态的访问,这在Haskell等更严格的函数语言中是被禁止的(尽管这种方法有其自身的问题).