違いは何ですか
def drop1[A](l: List[A]) = l.tail
と
def drop1(l: List[Int]) = l.tail
使用法が次のように見える場合
drop1(List(1,2,3))
?
どちらか一方を使用する必要があるのはいつですか。また、その理由は何ですか? 2 番目の例は理解できますが、最初の例の目的はよくわかりません。
違いは何ですか
def drop1[A](l: List[A]) = l.tail
と
def drop1(l: List[Int]) = l.tail
使用法が次のように見える場合
drop1(List(1,2,3))
?
どちらか一方を使用する必要があるのはいつですか。また、その理由は何ですか? 2 番目の例は理解できますが、最初の例の目的はよくわかりません。
つまり、一部の操作は特定の型に依存せず、抽象化できます。リンゴを数えるのとミカンを数えるのは、基本的に同じ操作です。アルゴリズムを再利用する場合は、記述するよりもいくつかの型を抽象化する方が賢明です
def countOranges(xs: List[Orange]) = { some code }
def countApples(xs: List[Apple]) = { the very same code }
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}