4

違いは何ですか

def drop1[A](l: List[A]) = l.tail

def drop1(l: List[Int]) = l.tail

使用法が次のように見える場合

drop1(List(1,2,3))

?

どちらか一方を使用する必要があるのはいつですか。また、その理由は何ですか? 2 番目の例は理解できますが、最初の例の目的はよくわかりません。

4

4 に答える 4

3

つまり、一部の操作は特定の型に依存せず、抽象化できます。リンゴを数えるのとミカンを数えるのは、基本的に同じ操作です。アルゴリズムを再利用する場合は、記述するよりもいくつかの型を抽象化する方が賢明です

def countOranges(xs: List[Orange]) = { some code } 
def countApples(xs: List[Apple]) = { the very same code }
于 2014-01-14T14:26:00.500 に答える
0

Java のジェネリックについてのアイデアがあれば、ここで類推することができます。

Java --> ジェネリック クラスのオブジェクトをメソッドの引数に渡すことができます。

class Test<T> {
    // An object of type T is declared
    T obj;
    Test(T obj) {  this.obj = obj;  }  // constructor
    // some other methods in class 
}

Test<String> testobj = new Test<String>();

public void function(testobj){ 
// do something with testobj 
}

Scala --> 一般的なパラメトリック関数が scala で動作するのと同じ方法。ここで、[A] は scala でジェネリック Type を定義します。

def drop1[A](l: List[A]) = l.tail

上記の機能の使用法:-

scala>drop1(List(1,2,3))   // output List(2, 3)
scala>drop1(List(1.0,2.0,3.0)) // output List(2.0, 3.0)
scala>drop1(List('a','b','c'))  // output List(b, c)

説明:-任意のタイプのリストを渡すだけで、チャームのように機能します。構文は次のようになります:-

def function[Type](param:Type):Type = {do something}
于 2018-06-26T17:16:10.077 に答える