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
类型的定义(并且 uHalf
是 Rand
类型),元组的另一半只能是 RNG
类型,这在您的代码示例中未定义。但是,假设您手边有 RNG
类型的 blob
。
val tup = uHalf(blob) // this is the "rng" parameter
现在你有了元组 ('q', blob)
。
你是对的,在示例 List(3,2,1).map(x => ...
中,x
是 List
提供的值的替代。在 Rand
的情况下,rng
是稍后在代码中提供的值(类型 RNG
)的替代 sometime/somewhere。
我真的不知道该怎么称呼这个问题。呈现的标题是我能想到的最好的。
我们目前正在学校使用 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
类型的定义(并且 uHalf
是 Rand
类型),元组的另一半只能是 RNG
类型,这在您的代码示例中未定义。但是,假设您手边有 RNG
类型的 blob
。
val tup = uHalf(blob) // this is the "rng" parameter
现在你有了元组 ('q', blob)
。
你是对的,在示例 List(3,2,1).map(x => ...
中,x
是 List
提供的值的替代。在 Rand
的情况下,rng
是稍后在代码中提供的值(类型 RNG
)的替代 sometime/somewhere。