scala 一个语法问题


如题, 下面这个map2的方法声明理解存在问题,不理解rng这个地方的值到底是怎么传入的,如果这是scala的lambda表达式,那么rng的值是如何来的呢

附上 Rand 的定义


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


 def map2[A,B,C](ra: Rand[A], rb: Rand[B])(f: (A, B) => C): Rand[C] =
    rng => {
      val (a, r1) = ra(rng)
      val (b, r2) = rb(r1)
      (f(a, b), r2)
    }

  def both[A,B](ra: Rand[A], rb: Rand[B]): Rand[(A,B)] =
    map2(ra, rb)((_, _))

scala

推倒绿坝娘 10 years, 2 months ago

在这个例子中,还没有地方传入rng的值。

你的代码不妨这么理解:


 scala


 def map2[A,B,C](ra: Rand[A], rb: Rand[B])(f: (A, B) => C): Rand[C] = {
  def result(rng: RNG): (C, RNG) = {
      val (a, r1) = ra(rng)
      val (b, r2) = rb(r1)
      (f(a, b), r2)
  }
  return result
}

其实你写的代码是这段代码的一个语法甜品而已。看到这段代码,就可以知道 rng 只是你返回值(是一个函数)中的形参罢了。后续你就可以调用 result(rng)了,这里rng就是调用者负责的内容了。

黑社会大流氓 answered 10 years, 2 months ago

在REPL中做如下测试:


 scala


 scala> implicit val a = 1
a: Int = 1

scala> def test : Int => Double = a => a * 3.0
test: Int => Double

或者:


 scala


 scala> val b = 2
b: Int = 2

scala> def test2 : Int => Double = b => b * 3.0
test: Int => Double

至于 rng 的来源,请查看 map2 方法的scope中是否有满足需求(RNG类型)的变量、隐式值等...

知识点 参考 Scala 的 closure、implicit value 等。

小A真是欠草 answered 10 years, 2 months ago

map2的返回值是个函数,rng只是这个函数的参数。
在贴出的代码中没有对返回函数的调用,所以rng自然也没有值。
rng在函数体中被ra调用
ra的类型是Rand[A],也就是一个函数,接收RNG,返回(A,RNG).因而rng的类型是RNG并且代码中可以省略。

Koolee answered 10 years, 2 months ago

Your Answer