我正在阅读Scala中的Functional Programming一书中的一些代码示例(但我的问题与FP无关). https://github.com/fpinscala/fpinscala/blob/master/answers/src/main/scala/fpinscala/state/State.scala
我有关于以下行的Scala语法问题:
val int: Rand[Int] = _.nextInt
Run Code Online (Sandbox Code Playgroud)
从这个摘录:
trait RNG {
def nextInt: (Int, RNG) // Should generate a random `Int`. We'll later define other functions in terms of `nextInt`.
}
object RNG {
case class Simple(seed: Long) extends RNG {
def nextInt: (Int, RNG) = {
val newSeed = (seed * 0x5DEECE66DL + 0xBL) & 0xFFFFFFFFFFFFL // `&` is bitwise AND. We use the current seed to generate a new seed.
val nextRNG = Simple(newSeed) // The next state, which is an `RNG` instance created from the new seed.
val n = (newSeed >>> 16).toInt // `>>>` is right binary shift with zero fill. The value `n` is our new pseudo-random integer.
(n, nextRNG) // The return value is a tuple containing both a pseudo-random integer and the next `RNG` state.
}
}
type Rand[+A] = RNG => (A, RNG)
val int: Rand[Int] = _.nextInt
}
Run Code Online (Sandbox Code Playgroud)
下划线在这里指的是什么?int在这种情况下甚至是什么?这只是一个功能nextInt吗?但如果是这样,下划线如何指向该功能?
这是普通的函数占位符语法.
_.nextInt
Run Code Online (Sandbox Code Playgroud)
是相同的
(_: RNG).nextInt
Run Code Online (Sandbox Code Playgroud)
反过来又是一样的
(rng: RNG) => rng.nextInt
Run Code Online (Sandbox Code Playgroud)
因此,int是一个函数,它接受一个RNGas参数并通过调用参数上的方法返回一个Int和新的状态RNG结果nextInt.
更新
编译器可以扩展_为(_: RNG),因为您已明确指定了赋值左侧的预期类型:
val int: Rand[Int] = ...
Run Code Online (Sandbox Code Playgroud)
是相同的
val int: RNG => (Int, RNG) = ...
Run Code Online (Sandbox Code Playgroud)
这是一样的
val int: Function1[RNG, (Int, RNG)] = ...
Run Code Online (Sandbox Code Playgroud)
和类型参数RNG,(Int, RNG)不必在右侧重复提及.
下划线占位符语法的其他用法:
| 归档时间: |
|
| 查看次数: |
58 次 |
| 最近记录: |