概要

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をほっぽりだしてるのでまずそちらを書く予定。