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一个纯函数的例子,因为它不修改状态?
不,因为它实际上确实修改了状态.new scala.util.Random最终调用new java.util.Random,访问和修改一个静态(即全局),可变的AtomicLong被调用seedUniquifier.因此,如果多次调用此方法,则结果将发生变化.
这是一个很好的例子,说明无辜的看似方法如何隐藏对全局可变状态的访问,这在Haskell等更严格的函数语言中是被禁止的(尽管这种方法有其自身的问题).