LoginSignup
0
0

IntelliJ で Scala Tutorial をやってみた

Last updated at Posted at 2023-12-18

Kotlin を覚える時に IntelliJ で Kotlin Koans か何かをやったのが役に立ったので、Scala を使い始めるにあたっても同じようにしてみました。

内容としては Scala Tutorial ですが、IntelliJ 上で動かしながら学べます。

最後までやることで、Scala ほんのちょっとわかる、という気持ちになることができます。

開始方法

IntelliJ を起動し、File > Learn and Teach > Browse Courses で、Marketplace から Scala Tutorial を選択し Open します。

課題の模範解答を見て疑問に思ったところ

ラムダ式を簡潔に書くための underscore について

Standard Library の List の課題の正解で、唐突に以下の表記が使われていました。

  val cond: (Int, Int) => Boolean = (_: Int) < (_: Int)

これは以下の長いラムダ式を簡単に書く方法のようです。

  val cond: (Int, Int) => Boolean = (x: Int, y: Int) => x < y

(参考)Anonymous Functions

新しい書き方を覚えたら使ってみたくなるものです。ですが、次 (Common Operations on Lists) の課題で早速誤った書き方をしてしまいました。以下の長い書き方

  def optionFlatMap(x: Option[Int]): Option[Int] = {
    x.flatMap(x => Some(x + 1))
  }

を underscore を使って

  def optionFlatMap(x: Option[Int]): Option[Int] = {
    x.flatMap(Some(_ + 1))
  }

と書けるかと思ったのですが、これは長く書き直すと

  def optionFlatMap(x: Option[Int]): Option[Int] = {
    x.flatMap(Some(x => x + 1))
  }

なので、全然違う意味になるのですね。なにがおかしいのかわからず、しばらく悩んでしまいました。

Covaliance の課題の解答について

解答は

  class AnimalVet[+T](val animal: T)

となっていたのですが、

  class AnimalVet[+T <: Animal](val animal: T)

のほうが適切だと思います。というのは、前者の定義だと

    val intVet = new AnimalVet(1)

という、整数 1 を治療する謎の獣医が存在できてしまうためです。
吹き出しアイコンからフィードバックを送っておきました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0