Scala 中的类型别名

Type aliasing in Scala

我真的不知道该怎么称呼这个问题。呈现的标题是我能想到的最好的。

我们目前正在学校使用 Scala 进行函数式编程,并且经常会出现一些情况,其中某些事情在我习惯的方式中没有意义......一个特殊的例子是这个:

type Rand[+A] = RNG => (A, RNG)

val int: Rand[Int] = _.nextInt

def unit[A](a: A): Rand[A] =
   rng => (a, rng)

我们在这里处理状态,试图避免每次使用 RNG 特征生成新随机数时必须将新状态传输到每个函数的重复。

我的问题是:

lambda 函数表达式定义谓词“rng =>”用作我们状态的占位符。通常这个谓词定义的内容很清楚,例如 List.map(x => x) 其中 x 是列表的每个元素。但是我不清楚这里的 rng 是什么。

编辑:我想有些人不明白这个问题,所以我会在这里举一些进一步的例子来澄清......

我不是在问 Rand[A] 代表什么。我在问接收到的参数 rng => 应该被解释为什么...例如

def map[A,B](l: List[A])(f: A => B): List[B] = ...
val l = List(1,2,3,4,5)
// l.map(x => x+1) -> List(2,3,4,5,6)

在上面的map例子中,非常概念上很容易理解函数参数f给出的接收参数x =>是解释为列表的每个单独元素 l.

我特意在unit中寻找与rng =>的这种概念联系。

好的,我试试看。

def unit[A](a: A): Rand[A] = rng => (a, rng)

此处unit接受一个参数并构建半个元组。它 returns 构建完整元组的方法。

val uHalf = unit('q')  // this is the "a" parameter

现在,由于 Rand 类型的定义(并且 uHalfRand 类型),元组的另一半只能是 RNG 类型,这在您的代码示例中未定义。但是,假设您手边有 RNG 类型的 blob

val tup = uHalf(blob)  // this is the "rng" parameter

现在你有了元组 ('q', blob)

你是对的,在示例 List(3,2,1).map(x => ... 中,xList 提供的值的替代。在 Rand 的情况下,rng 是稍后在代码中提供的值(类型 RNG)的替代 sometime/somewhere。