gotoshin

主に学んだ事の自分メモ用です。記事に書くまでも無いような事はhttps://scrapbox.io/study-diary/に書いてます。

Scala 型パラメータ&関数

ドワンゴ社 新卒エンジニア向けのScala研修資料をやっていくもの

資料

Introduction · 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]の様に先頭に+を付与することで共変として定義する事が可能
  • Javaだと以下の様なコードがコンパイルが通ってしまう

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]の様に先頭に-を付与することで反変として定義する事が可能

型パラメータの境界(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ではない

高階関数

  • 関数を引数に取ったり関数を返すメソッドや関数のことを高階関数と呼びます。