0Pricing
Scala for Backend Engineering & Functional Programming · レッスン

型推論

コンパイラーに型を推論させます。

「型推論」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。

型推論とは

Scala は静的型付け言語ですが、型を明示的に書く必要はほとんどありません。コンパイラーが右辺の値から型を推論します。

これにより、動的言語の簡潔さと型による安全性を両立できます。

val n = 42        // inferred Int
val label = "hi" // inferred String

リテラルからの推論

val x = 5と書くと、コンパイラーはIntリテラルを認識し、xの型をIntにします。

小数リテラルはDoubleになり、引用符で囲んだテキストはStringになります。

object Main extends App {
  val count = 5
  val ratio = 1.5
  println(count + ratio)
}

関数の戻り値の推論

コンパイラーは、メソッドの本体から戻り値の型を推論することもできます。

ここでは、本体が2つのInt値を掛け合わせているため、squareはIntを返します。型を明示する必要はありません。

object Main extends App {
  def square(x: Int) = x * x
  println(square(6))
}

パラメーターには型が必要

推論には限界があります。メソッドのパラメーターには注釈が必要です。コンパイラーには、そこから推論するための情報がないためです。

以下のスニペットは、xに: Intを付けないとコンパイルできません。

def increment(x: Int) = x + 1 // type on x is required

推論される共通型

値が複数の型になり得る場合、Scala は最も具体的な共通型を推論します。

算術演算でIntとDoubleを混ぜると、結果はDoubleに広がります。

object Main extends App {
  val mixed = 3 + 2.0  // Double
  println(mixed)
}

コレクションでの推論

コレクションは、格納する値から要素の型を推論します。

整数のリストは自動的にList[Int]になるため、注釈なしで完全な型安全性を保てます。

object Main extends App {
  val nums = List(1, 2, 3) // List[Int]
  println(nums.sum)
}

推論に驚かされる場合

推論によって、望んでいた型より広い型が選ばれることがあります。異なる数値を混ぜたリストは、List[Double]、場合によってはList[AnyVal]と推論されます。

推論された型が目的に合わない場合は、明示的な注釈を追加します。

val a = List(1, 2.0)        // List[Double]
val b = List(1, "two")     // List[Any]

注釈で上書きする

いつでも明示的に指定できます。型を注釈で指定すると、意図を文書化でき、狭すぎる推論を上書きできます。

ここでは、リテラル7を意図的にLongへ広げています。

val seconds: Long = 7
val data: List[Int] = List(1, 2, 3)

パブリック API では明示する

一般的なスタイル上のルールとして、ローカルのvalには推論を任せ、パブリックメソッドには明示的な戻り値の型を書きます。

これにより、実装が変わってもライブラリの契約を安定させられます。

def total(items: List[Int]): Int = items.sum

推論でも型安全性は保たれる

推論によって型システムが弱まることはありません。コンパイラーは無効な操作を引き続き拒否します。

以下では、nameはStringと推論されるため、数値との乗算はコンパイルに失敗します。これは正しい動作です。

val name = "Lia"
val bad = name * 3 // error: value * is not a member of String in this sense

推論された val も不変

推論が補うのは型だけです。束縛が可変かどうかは変わりません。

val n = 10は依然として不変で、Intとして固定されます。コンパイラーが: Intと入力する手間を省いただけです。

object Main extends App {
  val n = 10 // inferred Int, still a val
  println(n * n)
}

理解度チェック

Scala で型を記述する必要が残るのは、どこでしょうか。

まとめ

型推論により、Scalaは静的な安全性を損なわずに簡潔に記述できます。

  • ローカルのvalと戻り値の型は、通常推論されます。
  • メソッドのパラメーターには型注釈が必要です。
  • 型推論では、共通する最も具体的な型が選ばれます。
  • 公開APIでは、または推論結果が意外な場合は、明示的に型注釈を付けてください。

よくある質問

「型推論」レッスンは無料ですか?

はい。「型推論」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。

「型推論」で何を学びますか?

コンパイラーに型を推論させます。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「型推論」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?

はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. valとvar
  2. 基本型とリテラル
  3. 型推論
  4. 文より式
← Scala for Backend Engineering & Functional Programmingに戻る