有人能解释一下Scala函数的语法吗?

有人能解释一下Scala函数的语法吗?,scala,Scala,这是我在网上找到的一个函数,用于测量代码块在Scala中执行的时间。我不明白参数列表前的[R]是什么,或者R是什么——它只是表示任何数据类型的标识符吗?我对Scala比较陌生,因此非常感谢您的帮助,这只是一个类型参数,在Java中是,在Scala中是[R] Java中的类似代码是: def time[R](block: => R): R = { val t0 = System.nanoTime() val result = block // call-by-name

这是我在网上找到的一个函数,用于测量代码块在Scala中执行的时间。我不明白参数列表前的[R]是什么,或者R是什么——它只是表示任何数据类型的标识符吗?我对Scala比较陌生,因此非常感谢您的帮助,这只是一个类型参数,在Java中是
,在Scala中是
[R]


Java中的类似代码是:

def time[R](block: => R): R = {
    val t0 = System.nanoTime()
    val result = block    // call-by-name
    val t1 = System.nanoTime()
    println("Elapsed time: " + (t1 - t0) + "ns")
    result
}
将打印

System.out.println(time(() -> "hello world"));

在Scala中,参数类型
=>R
本质上是一个函数。这种语法的好处是用户不必编写lambda

Elapsed time: 12345ns
hello world
需要类型参数
R
,因为我们希望
time
函数是泛型的。
R
在第一个示例中是
String
,在第二个示例中是
Int

这只是一个类型参数,在Java中是
,在Scala中是
[R]


Java中的类似代码是:

def time[R](block: => R): R = {
    val t0 = System.nanoTime()
    val result = block    // call-by-name
    val t1 = System.nanoTime()
    println("Elapsed time: " + (t1 - t0) + "ns")
    result
}
将打印

System.out.println(time(() -> "hello world"));

在Scala中,参数类型
=>R
本质上是一个函数。这种语法的好处是用户不必编写lambda

Elapsed time: 12345ns
hello world
需要类型参数
R
,因为我们希望
time
函数是泛型的。
R
在第一个示例中是
String
,在第二个示例中是
Int

这只是一个类型参数,在Java中是
,在Scala中是
[R]
。我仍然有点困惑-如果这是一个愚蠢的问题,很抱歉,但它代表的是什么类型?参数列表中的R表示参数类型,而:后面的R表示函数的返回类型,那么还有什么类型需要[R]呢?@PS900它像一个变量一样工作,但在类型级别。问题是,这个函数适用于任何返回R的计算,R是什么,任何人,这都不重要,但是你给它一个名称,这样你就可以引用它。基本上,这是同一句话
def sum(a:Int,b:Int):Int=a+b
,什么是
a
&
b
,变量,它们可以是任何东西。如果不能使用变量,则需要为单词中的每对数字编写一个方法。sames适用于R,如果您不能使用它,那么您需要为int编写函数,为字符串编写其他函数。请注意,您也可以使用Any,因为Any是Any类型的子类型。它的问题是丢失了类型信息。例如,身份
def identity[T](T:T):T=T
因此,如果像这样使用
identity(10)
结果将再次是
10
,它将保留其类型Int。如果我们使用
def identity(T:Any):Any=T
,那么
identity(10)
也将返回相同的
10
,但这次它将是Any类型,因此,您不能再将其用于数学运算,因为它不再是一个数字,而是任何东西。这只是一个类型参数,在Java中它是
,在Scala中它是
[R]
。我仍然有点困惑-如果这是一个愚蠢的问题,很抱歉,但它代表的是什么类型?参数列表中的R表示参数类型,而:后面的R表示函数的返回类型,那么还有什么类型需要[R]呢?@PS900它像一个变量一样工作,但在类型级别。问题是,这个函数适用于任何返回R的计算,R是什么,任何人,这都不重要,但是你给它一个名称,这样你就可以引用它。基本上,这是同一句话
def sum(a:Int,b:Int):Int=a+b
,什么是
a
&
b
,变量,它们可以是任何东西。如果不能使用变量,则需要为单词中的每对数字编写一个方法。sames适用于R,如果您不能使用它,那么您需要为int编写函数,为字符串编写其他函数。请注意,您也可以使用Any,因为Any是Any类型的子类型。它的问题是丢失了类型信息。例如,身份
def identity[T](T:T):T=T
因此,如果像这样使用
identity(10)
结果将再次是
10
,它将保留其类型Int。如果我们使用
def identity(T:Any):Any=T
,那么
identity(10)
也将返回相同的
10
,但这次它将是Any类型,因此,您不能再将其用于数学运算,因为它不再是一个数字,而是任何东西。