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

时间:2015-02-13 20:10:51

标签: scala

欢迎大家,

我实际上是通过学习“Scala中的函数式编程”一书来学习scala,在本书中,作者通过在[]括号中添加类型参数化函数,如下所示:

def sortList[A](xs: List[A]): List[A] = ...

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

2 个答案:

答案 0 :(得分:3)

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

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

val list = 10::30::List(20)
val sortedList = sortList(list)

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

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

重要的是要注意,当List被创建为List [Int]类型时,最初会推断出类型,然后编译器也可以看到稍后,当列表传递给sortList函数时,该类型传递给sortList的List是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)

答案 1 :(得分:0)

在使用之前必须声明类型,这样就可以引入类型,以便稍后使用。与类泛型类型(或类似Java,C#)类似。