gpt4 book ai didi

scala - 类型推断如何用于使用占位符语法的选择?

转载 作者:行者123 更新时间:2023-12-01 08:14:45 27 4
gpt4 key购买 nike

我正在阅读《Scala 函数式编程》一书中练习中的一些代码示例(但我的问题与 FP 无关)。 https://github.com/fpinscala/fpinscala/blob/master/answers/src/main/scala/fpinscala/state/State.scala

我有一个关于以下行的 Scala 语法问题:

val int: Rand[Int] = _.nextInt

摘录如下:

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
}

这里的下划线指的是什么?在这种情况下,int 到底是什么?它只是一个函数,特别是 nextInt 吗?但如果是这样,下划线如何指向该函数呢?

最佳答案

就是普通的function placeholder syntax .

_.nextInt

相同
(_: RNG).nextInt

这又与

相同
(rng: RNG) => rng.nextInt

因此,int 是一个以 RNG 作为参数并返回 IntRNG< 的新状态的函数 作为通过调用参数 nextInt 方法得到的结果。


更新

编译器可以将 _ 扩展为 (_: RNG),因为您已在赋值的左侧显式指定了预期类型:

val int: Rand[Int] = ...

相同
val int: RNG => (Int, RNG) = ...

相同
val int: Function1[RNG, (Int, RNG)] = ...

并且类型参数 RNG(Int, RNG) 不必在右侧重复提及。


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

  1. println(_)

关于scala - 类型推断如何用于使用占位符语法的选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52748130/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com