在Scala中键入别名

时间:2017-03-31 23:59:34

标签: scala functional-programming states

我实际上并不知道该怎么称呼这个问题。提出的标题是我能想到的最好的。

我们目前正在学校的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在这里是什么。

编辑:我想有些人不理解这个问题所以我会在这里给出一些进一步的例子来澄清......

我不问兰德[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)

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

我在rng =>中专门寻找unit的概念性连接。

1 个答案:

答案 0 :(得分:4)

好的,我已经去了。

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

这里unit接受一个参数并构建一个元组的一半。它返回构建已完成元组的方法。

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

现在,由于类型Rand的定义(uHalf类型为Rand),元组的另一半只能是RNG类型,在代码示例中没有定义。但是,让我们说blob类型为RNG

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

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

您是对的,在示例List(3,2,1).map(x => ...中,x是从List提供的值的替代。在Rand的情况下,rng是代码中某个时间/某个地方提供的值(RNG类型)的替代。