在函数定义中的[]括号中添加类型

Gaw*_*osz 7 scala

欢迎大家,

我实际上是通过学习"Scala中的函数式编程"一书来学习scala,在本书中,作者通过在函数名称后面的[]括号中添加类型来参数化函数,如:

def sortList[A](xs: List[A]): List[A] = ...
Run Code Online (Sandbox Code Playgroud)

这样做的原因是什么?编译器不能从参数中自行推断它?或者我错过了什么?

Mik*_*rry 6

在上面的特定实例中,A 是 sortList 函数将处理的类型。换句话说,它将接受一个包含 A 类型对象的 List 并对它们进行排序,返回一个包含 A 类型对象的新 List。

您可以按如下方式使用它:

val list = 10::30::List(20)
val sortedList = sortList(list)
Run Code Online (Sandbox Code Playgroud)

scala 编译器会检测传入的 List 的类型是 Int 的列表,并理解声明中的“A”是传入的 List 的类型。

编译时必须知道类型,但是scala非常擅长推断类型,在上面的例子中,可以看到传入的列表的类型是一个Int的列表

需要注意的是,当 List 被创建为 List[Int] 类型时,该类型最初被推断出来,然后编译器也可以在稍后看到,当列表被传递给 sortList 函数时,List 的类型是传入 sortList 是 List[Int]

这里有一些额外的例子,我把它们放在一起来展示更多。如果您在 Scala 命令行中或使用 Scala Eclipse 工作表运行这些命令,您将看到发生了什么。这里唯一额外的一点是,它还表明您可以将类型应用于 sortList 而无需其他参数,以使其特定于 Ints 而不是适用于所有类型。

/* Declare a List[Int] and List[String] for use later */
val list = 10::30::List(20)
val stringList = "1"::"2"::List("3")

/* Doesn't actually sort - just returns xs */
def sortList[A](xs: List[A]): List[A] = xs

/* Sort both lists */
sortList(list)
sortList(stringList)

/* Create a version of sortListInt which just works on Ints */
def sortListInt = sortList[Int] _

/* Sort the List[Int] with the new function */
sortListInt(list)

/* fails to compile - sortListInt is a
version of sortList which is only applicable to Int */
sortListInt(stringList)
Run Code Online (Sandbox Code Playgroud)