我が名はなんとか菜である!

主に技術系の記事を書きますが、ポエムも混入します。

Scalaに入門したけどやっぱりやめた話

ポエムです
以前に身内の勉強会で披露したネタを記事に起こしてみます。

Scala とは (ver2.12.10)

OOP + FP のマルチパラダイムプログラミング言語

Scalaオブジェクト指向と関数型の2つのコーディングスタイルに向いて設計されたマルチパラダイム言語です。

オブジェクト指向プログラミング言語の『データ構造を直感的に扱うことの出来る特徴』と、関数型プログラミング言語の『処理を直感的に扱うことの出来る特徴』を併せ持っています。また、C++といった言語と違い、それらが文法的にも高いレベルで統合されており、非常に扱いやすい言語となっています。

例えば、Scalaではあらゆるオブジェクトが第一級オブジェクトです。これにより、メソッドを簡潔に記述したり、コールバックやデリゲートを引数に渡して処理内容を移譲させたりと言った非同期処理でよく必要とされるものを直感的に扱うことができます。

関数型言語の特徴のうち、パターンマッチは非常に強力な機能の一つとして数えられますが、それはScalaにもしっかり搭載されており、数値だけでなく型といった抽象的な概念でのパターンマッチングも行うことが出来ます。

val age = 17
val name = "houshou_marin"

// 型によるパターンマッチ
age match {
  case v: java.lang.Integer => println("Integer!")
  case v: String => println("String!")
  case _ => println("Unknown")
}

// タプルを使った複数値のパターンマッチ
(age, name) match {
  case (17, "houshou_marin") => println("Yes, Captain marin is 17 years old.")
  case (_, "houshou_marin") => println("Captain marin is 17 years old ABSOLUTELY.")
  case _ => println("who?")
}

よいところ

JVM 上で動く、Javaよりも表現力の高い言語

Scalaコンパイルすると、JVM上で実行可能な .class ファイルを出力します。
これはつまり、Javaで作られた過去の資産を利用することが出来るということです。
また、JVMが動く環境であれば容易に移植が可能ということでもあります。
なので、JVMで動かさなければならないという状況でもJava以外の選択肢が採れるようになり、開発効率の向上が見込めます。

Immutable List が標準搭載

val list = List(1,2,3) // Immutable
val arr = Array(1,2,3) // Mutable

汎用性の高いパターンマッチング

これは前述の通り。

よくないところ

AnyRef という何でも入る型がある

コード規約などで縛ればよいのですが、コードの治安というのは一度崩れるとどこまでも崩れていくものなので、このような型は内部的には存在していてもよかったとしても、プログラマーが直接書けるような型として存在するべきではなかったのではないかと思います。

タプルが嘘

これはどちらかというとJVMの問題ですが、Scalaのタプルは単なる糖衣構文(というか、コンパイラに特別扱いされている系のやつ)なので、 要素が23個以上のタプルを作るとコンパイルエラーになります。まあ、そんなタプルを作っている時点で書いている側が悪い気はするけど。

## なぜ入門をやめたのか

パッケージマネージャの作りが古い

個人的には

sbt install xxx

とした時点で xxx の最新のパッケージが降ってきて欲しいのですが、Scalaの場合は

sbt update

と、一度挟まないといけないようです、 Debian の apt みたいな感じですね。
なのでnpm や Rust に比べると使い勝手が一歩劣ります。僕は遭遇したことがないけどローカルのキャッシュが崩壊するというようなこともありうるのでは。
まあやはりパッケージサーバーを維持するのはタダではないので、バックグラウンドにいる企業力ということなのでしょうか。

コンパイル時間が長い

2回目以降はキャッシュが効いてマシになるという話はあるけど、 Hello World に 9sec 掛かったのはうげぇとなってしまった。
コンテナ化はしづらいんじゃないかと邪推してしまう。(これも試してないけど)

PlayFrameworkが微妙

MVCはもう書きたくないでござる。

参考文献

scala-text.github.io