Scala 型パラメータ&関数
ドワンゴ社 新卒エンジニア向けのScala研修資料をやっていくもの
資料
型パラメータ
- Javaでいうジェネリクスの様なイメージ
- メソッドの返り値を複数取りたい場合は複数型パラメータを取るクラスを作成し、返り値のクラスをその値にしてしまうと二つ取得する事が可能
- Tuple1からTuple22まであらかじめ用意されている
以下の様に新たに作成せずとも
new Tuple2(m / n, m % n)
この様に作成する事ができる
(m / n, m % n)
共変
共変というのは、型パラメータを持ったクラスG、型パラメータAとBがあったとき、A が B を継承しているときにのみ
val : G[B] = G[A]
の様な代入が許される性質を表す- 継承先を継承元へ代入する事が可能になる
- Scalaだと定義時に
Class G [+A]
の様に先頭に+
を付与することで共変として定義する事が可能
Object[] objects = new String[1]; objects[0] = 100;
val arr: Array[Any] = new Array[String](1) <console>:7: error: type mismatch; found : Array[String] required: Array[Any]
(なんか前Effective Javaで読んだ様な...)
反変
- 共変の逆で、継承元を継承先へ代入する事が可能になる性質
- Scalaだと定義時に
Class G [-A]
の様に先頭に-
を付与することで反変として定義する事が可能
- Scalaだと定義時に
型パラメータの境界(bounds)
- 大枠はJavaのそれと同じであると理解した
関数
Scalaの関数は単に Function0 〜 Function22 までのトレイトの無名サブクラスのインスタンスなのです。
- なのでこんな感じで定義する事が可能
val add = new Function2[Int, Int, Int]{ def apply(x: Int, y: Int): Int = x + y }
ちな無名サブクラス
が実際は以下の様にシンタックスシュガーを用いて記載可能である
val add = (x: Int, y: Int) => x + y
関数本体には何の名前も付いていないことに注意してください。この、addの右辺のような定義をScalaでは無名関数と呼びます。
このような、関数を自由に変数や引数に代入したり返り値として返すことができる性質を指して、Scalaでは関数が第一級の値(First Class Object)であるといいます
関数のカリー化
以下の記事が分かり易かったため省略する
サルでもわかるカリー化とそのメリット - These Walls
メソッドと関数の違い
- メソッドは
def
から始まるもので、First Class Object
ではない
高階関数
関数を引数に取ったり関数を返すメソッドや関数のことを高階関数と呼びます。