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関数を受け入れます。最後に、同じタイプを返します。IterableBooleanIterable

上記のタイプ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のメソッドは、のように1つ以上type parameterのを受け入れることができます。classobjecttrait

この場合、呼び出しごとに異なるタイプに対して同じメソッドをT呼び出すことができますが、定義内で一貫している必要があります。

たとえば使用してみましょう

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

このメソッドは、次のものを渡すことを想定しています。--
an Iterableof Ts(unfiltered
-aTをa Booleanpredicate)に変換する関数で
、結果はsの別IterableのものになりますT

次に、メソッドはunfilteredオブジェクトを反復処理し、要素ごとにを適用してpredicate、フィルタリングする必要があるかどうかを判断します。

結果には、 (つまり、を返す要素)Iterableを満たす要素のみが含まれます。predicatetpredicate(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 に答える