0

我正在为不耐烦的人浏览 Scala,但不幸的是,它假设了以前的 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]. 我在参数列表中了解,我们正在寻找一个 Iterable 类型T。但是如果 T 是一个类型,那是什么predicate: T => Boolean意思呢?

4

3 回答 3

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)
于 2013-02-08T20:33:50.143 回答
2

类型参数方法

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

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

让我们使用例如

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

该方法希望您传递:
- an Iterableof Ts ( unfiltered)
- 一个将 a 转换T为 a Boolean( predicate)的函数,
结果将是另一个Iterables 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) 

                                                                             ^
于 2013-02-09T11:23:43.830 回答
0

它被称为泛型方法

(在 java、C# 和 C++ 中也有类似的功能(调用它的地方是模板函数))

于 2013-02-09T09:36:23.317 回答