类型推断如何适用于具有占位符语法的选择?

vae*_*r-k 2 scala

我正在阅读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吗?但如果是这样,下划线如何指向该功能?

And*_*kin 5

这是普通的函数占位符语法.

_.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)不必在右侧重复提及.


下划线占位符语法的其他用法:

  1. println(_)