概要
Scalaのイベントに行ってきました。
環境構築すらしていない状況での参加だったので、出てきたコードも読めない部分が多かったです。
ただ興味は湧いたので、忘れないうちに書いてみました。
環境
macOS 10.14.5(18F132)
Intellij IDEA 2018.2.5 ULTIMATE
javaのインストール
javaは既に入っていたのでスキップ。
入っていない場合は
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
からインストール。
javaのバージョンは今の所8が安定らしいです。
私の環境では11が入っていたのでそのまま使います。
sbtのインストール
sbtはScalaのビルドツールです。モジュール管理とかもやってくれます。
公式をみる限りIDEAあるなら要らなそうですが一応入れました。
brew install sbt
確認
java -version
> java version "11.0.1" 2018-10-16 LTS
sbt about
> This is sbt 1.2.8
> sbt, sbt plugins, and build definitions are using Scala 2.12.7
参考
https://www.scala-lang.org/download/
Hello,Worldしてみる
IDEAでプロジェクト作成->Scala->sbtを選択してNext。
プロジェクト名を設定してFinish。バージョン指定ができるみたいですがデフォルトで行きます。
その後、src/main/scalaを右クリックしてNew->Scala ClassからObjectを作ります。
object Hello {
def main(args: Array[String]): Unit = {
println("Hello World")
}
}
こんな状態で動かせました。
出力
Hello World
気になったコードを試してみる
for,yield,Someについて
def main(args: Array[String]): Unit = {
val result = for {
i1 <- Some(1)
i2 <- Some(2)
i3 <- Some(3)
} yield i1 + i2 + i3
println(result)
println(result.get)
}
出力
Some(6)
6
forの中身がyieldで足されて返される。
Someはオプショナルで値があることを示している。逆がNoneらしい。
こうしてみるとどうなるのか?
val result = for {
i1 <- map get 1
i2 <- map get 2
i3 <- None
} yield i1 + i2
println(result)
}
出力
None
i3とresult.getがないのは型が違うとコンパイラに怒られるため。
要はfor内でNoneが入ればyieldでNoneが返るみたい。
もう少し使うかもしれない形に変えてみる。
val map = Map[Int,Int](1 -> 1, 2 -> 2, 3 -> 3)
val result = for {
i1 <- map get 1
i2 <- map get 2
i3 <- map get 3
} yield i1 + i2 + i3
println(result)
出力
6
val map = Map[Int,Int](1 -> 1, 2 -> 2, 3 -> 3)
val result = for {
i1 <- map get 1
i2 <- map get 2
i3 <- map get 4
} yield i1 + i2 + i3
println(result)
出力
None
後者では map get 4 でNoneが返るのでNoneとなっている。
型レベルのお話
発表でこういうものがあったのでBoolのところだけ動かしてみました。(ネタらしいので使う機会があるかは不明)
https://backpaper0.github.io/ghosts/type-level-addition/#1
元コード
https://gist.github.com/backpaper0/a8e71dd3e3952177f8a2423ce2215f9a#file-booldemo-scala:title
object BoolSample extends App {}
Appトレイトを使うことでコンストラクタがmainとして実行されるようです。
あとは大体資料とソース通りなので理解できた流れだけ紹介。
trait Bool {
type Not <: Bool
type And[A <: Bool] <: Bool
type Or[A <: Bool] <: Bool
}
trait True extends Bool {
type Not = False
type And[A <: Bool] = A
type Or[A <: Bool] = True
}
trait False extends Bool {
type Not = True
type And[A <: Bool] = False
type Or[A <: Bool] = A
}
object Bools {
type ![A <: Bool] = A#Not
type &&[A <: Bool, B <: Bool] = A#And[B]
type ||[A <: Bool, B <: Bool] = A#Or[B]
}
Bool型にnot,and,or関数を追加。
それを継承したTrue型を実装。
TrueのnotはFalseでandは引数と同じ。orは自身がTrueなのでTrueで確定。
Falseも同様に実装して最後に演算子っぽくすれば完成。
Scalaの関数は条件次第でスペース区切りや引数の間に置くことも出来るようなのでよりそれっぽくなる。
後は実際にScalaのtrue,falseに変換する関数を書けば実用(?)できる。 実行すればひたすらtrueが出力されます。
実際使う機会はないはず…。出くわしたら心折れそう。
Scalaとイベントの感想
Scala
最初は読めなかったけど徐々に分かり合える気がしてきた。
どの言語始める時もそうだが、Scalaっぽく書けるのかが分からないのでソースみながら慣れたい。
Scala書いてる人に見てもらうのが早いけど今の所心当たりはないのでしばらくは本に頼ります。
https://www.amazon.co.jp/dp/4297101416
イベント
イベントの資料はこちらに上がってます。ありがたい。
https://yahoo-osaka.connpass.com/event/130213/presentation/
mixleapとScala関西の紹介を除くと3つの発表がありました。
Scala導入最新事情調査レポート!
Scala関西の方によるScalaの概要紹介。
forを使ったコードはここで出てきて、分からなかったので懇親会中に解説していただきました。
おすすめの本の一冊として紹介されていて、上でも貼った実践scala入門は約一ヶ月積んでるのでこれを気に読みたい。
どんな特徴のある言語でどこに気を付けるべきかがまとまってたのでScalaに触れてなかった身としては助かりました。
Scalaで足し算する(ただし型レベルで)
型レベルで演算する(ネタ枠みたい)。
解説が丁寧だったので、やっていることはよくわかった。
まずは普通のアプリケーションを作りたいので試すのはしばらく先になりそう。
Scalaで自然文っぽくコードを書く
一番書いてみたいと思ったコード。ただ書いてない。
普通の英文っぽく(日本語も定義すればいける)コードを書けるので、主にテストコードの読みやすさがとても良かった。
参考
https://pleiades.io/help/idea/run-debug-and-test-scala.html
http://www.scalatest.org/user_guide/using_matchers
今回のソース
https://github.com/Tim0401/scala-hello-world
今後
- Play Frameworkが使えるらしいのでアプリケーション作成は楽そう。
- AkkaというライブラリがRESTAPI作りやすいという話を聞いたのでそちらも試してみたい。
- 基礎の文法を学びつつ簡単なRESTAPIサーバを建てる。
- Goをほっぽりだしてるのでまずそちらを書く予定。