Scala中调用的这种特殊语法是什么?

时间:2013-02-08 20:30:26

标签: scala

我正在浏览Scala for the Impatient,但不幸的是,它假定了以前的Java经验并且理解了[T]如何在这里使用:

object Iterables {
   def filter[T](unfiltered: Iterable[T], predicate: T => Boolean): Iterable[T] = {...}
   def find[T](iterable: Iterable[T], predicate: T => Boolean): T = {...}
}

[T]T的每个实例的语法都非常混乱。当它直接列在函数名称后面时有什么意义,例如filter[T]。我理解在参数列表中,我们正在寻找类型为T的Iterable。但如果T是一个类型,predicate: T => Boolean是什么意思?

3 个答案:

答案 0 :(得分:5)

此声明:

def filter[T](unfiltered: Iterable[T], predicate: T => Boolean): Iterable[T]

可以理解如下:对于任何类型T,此函数接受该类型的Iterable和该类型的函数Boolean。最后它返回相同类型的Iterable

上面的类型基本上意味着:您可以使用Iterable[String]Iterable[Date]Iterable[Foo]调用此函数 - 您就明白了。但无论你选择哪种类型,它都必须在所有地方都一样。例如:

val result = filter(List("a", "bb", "ccc"), (s: String) => s.length() > 1)

是对的。但这不是:

val result: Seq[Int] = filter(List("a"), (s: String) => s.length() > 1)

答案 1 :(得分:2)

类型参数化方法

scala中的方法可以接受一个或多个type parameter,就像classobjecttrait一样。

在这种情况下,它意味着可以为类型T调用相同的方法,该类型可能因调用而异,但必须在定义中保持一致。

让我们使用例如

def filter[T](unfiltered: Iterable[T], predicate: T => Boolean): Iterable[T]

该方法希望您通过:
  - Iterable Tunfiltered)的T   - 将Boolean转换为predicateIterable)的函数 结果将是T的另一个unfiltered

然后,该方法将对predicate对象进行迭代,并为每个元素应用Iterable,以确定是否必须对其进行过滤。

结果predicate仅包含满足t的元素(即predicate(t)true返回T的那些//filtered is List(2,3) val filtered: Iterable[Int] = filter(List(1, 2, 3), (i: Int) => i > 1) //filtered is List("b", "abc") val filtered: Iterable[String] = filter(List("a", "b", "abc"), (s: String) => s contains "b") //filtered is List(Some(1), Some(2)) val filtered: Iterable[Option[Int]] = filter(List(Some(1), Some(2), None), (op: Option[Int]) => op.isDefined) //you can't call this because T is not the same everywhere it's used val filtered: Iterable[Int] = filter(List(1, 2, 3), (op: Option[Int]) => op.isDefined) //this will get you <console>:12: error: type mismatch; found : Option[Int] => Boolean required: Int => Boolean val filtered: Iterable[Int] = filter(List(1, 2, 3), (op: Option[Int]) => op.isDefined) ^

您可以为任何类型{{1}}调用过滤器,其约束条件是所有参数和结果类型必须一致。

<强>实施例

{{1}}

答案 2 :(得分:0)

它被称为泛型方法

(在java,C#和C ++中也可以使用类似的功能(称为模板功能))