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
新しい書き方を覚えたら使ってみたくなるものです。ですが、次 (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 を治療する謎の獣医が存在できてしまうためです。
吹き出しアイコンからフィードバックを送っておきました。