这个类型参数“打字”怎么样?

时间:2014-02-07 00:23:38

标签: scala

在groupBy的方法签名中:

def groupBy[K](f : (A) => K) : Map[K, This]

groupBy上[K]的类型参数如何输入?在这种情况下[k]的意义是什么:groupBy [K]。为什么这里需要类型参数,这是Scala的一个要求,而不能使用:def groupBy(f : (A) => K) : Map[K, This]

4 个答案:

答案 0 :(得分:2)

How is the type parameter of [K] on groupBy typed ?

从传递给groupBy的函数类型,除非明确传递。

What is the significance of [k] in this context : groupBy[K] .

这是一个类型参数:在groupBy的定义网站上未修复的类型,而是根据此方法的每个使用网站的上下文而变化。

Why is the type parameter required here, is this a requirement of Scala that cannot use instead : `def groupBy(f : (A) => K) : Map[K, This]` ?

这是一项要求。在您提供的定义中,传递给groupBy的函数必须是A(类的类型参数)到KgroupBy定义的固定类型}。由于Scala中没有类型K,因此会自动出错。

或者,换句话说,就像将groupBy定义为def groupBy(f: (A) => String): Map[String, This]一样。

答案 1 :(得分:1)

K是方法级别类型参数,它不存在于类中。所以你的建议没有意义。 K也需要声明为类型参数,因为我假设你不想引用类型K,而是引用类型变量K.

答案 2 :(得分:0)

列表在scaladoc中定义为sealed abstract class List[+A] - 所以A是列表中元素的类型。您可以按任何函数f: (A) ⇒ K对列表元素进行分组,也就是说K可以是任何类型。如果您要通知编译器您可以按"函数f: (A) ⇒ K进行分组,其中K是某种类型",则需要声明符号K.这是在方法级别完成的,因为K仅用于方法级别。这是通过声明def groupBy[K](f: (A) ⇒ K): Map[K, List[A]]来完成的。希望这很清楚。

答案 3 :(得分:0)

首先指定K,因为KeySelector函数的类型,(A)=> K,结果的类型:Map [K,this]取决于它的定义。 K是类型参数,它允许groupBy实现通过任何类型的Key对组进行抽象。