Skip to content

Instantly share code, notes, and snippets.

@ryo-murai
Last active March 10, 2016 02:13
Show Gist options
  • Save ryo-murai/5d0f6edef0cad8dc3838 to your computer and use it in GitHub Desktop.
Save ryo-murai/5d0f6edef0cad8dc3838 to your computer and use it in GitHub Desktop.
社内でちょろっとやるscala勉強会スライド

いまさら学ぶScala


Scalaとは

マルチパラダイムなプログラミング言語

  • 関数型とオブジェクト指向
|    ★オブジェクト指向        |
+--------+-----+------+
|命令型(手続型)| 論理型 | ★関数型 |

作者


Scalaとは

  • コミュニティ主導のOSS
  • 事例: ニコ動、BRMS、Twitter、LinkedIn、FourSquare
  • 最新2.11.x
    • 仕様の安定重視の傾向

Why Scala ?

Javaは古い

  • 1995年登場
  • C++言語に意図的に似せた言語仕様
  • 後方互換性の呪縛
  • 後発の言語の進化に追従できてない(やっとJava8で並んだ。か?)

Javaは古い

  • Java(言語)は古い が、
  • Java VMはイケてる
    • マルチプラットフォーム
    • GC
    • Hotspot
    • 実行時最適化
    • デバッガ、プロファイラなどのツール

JVM言語の登場

  • Better Javaとして(Groovy, Scalaとか)
  • 他の言語のポーティング(JRuby, Clojure, Nashornとか)
  • Javaじゃない言語だけど、コンパイルするとclassファイルになる(かインタプリタ)
  • 現存するJavaライブラリなど資産の利用もOK

Better JavaとしてのScala

java to ruby

  • 「JavaからRubyへ」いけなかった人
    • 静的型付言語じゃないとチョット・・・
    • JVM好きなので・・・
    • Javaのライブラリ資産ガー

(屮゜Д゜)屮 < カモーン


Better Javaとして

あるいはNext Javaとして

Scala言語 超概要


Scala言語 超概要

classとinterface

  • classはある。
  • interfaceはない。

trait

  • 実装を持てるinterface的なもの
  • mix-inできる
trait Employee {
  def work: Result

  def salary: Money = { ... }
}

class Student extends Person with Employee with Logger {
  debug("my salary is " + salary)
}

Scala言語 超概要

object

  • singletonの言語的なサポート
object XmlParserFactory {
  def parser: XmlParser = ...
}
// new 要らない
val parser = XmlParserFactory.parser()

Scala言語 超概要

デフォルトパラメータ値と Named Parameters

def save(text: String, 
      encoding: String = "utf8", 
      newline: String = "LF", 
      color: String = "black") {
}
save("hello", "utf16")
save("hello", newline = "CRLF", color = "red")

Scala言語 超概要

Personクラス

uml

図リンク


Scala言語 超概要

Personクラス(Java)

class Person {
  private String name;
  private int age;
  private int height;
  private int weight;

  public Person(String name, int age, int height, int weight) {
    this.name = name;
    this.age = age;
    this.height = height;
    this.weight = weight;
  }

  public String getName() {
    return this.name;
  }

  public int getAge() {
    return this.age;
  }

(つづき)

  public int getHeight() {
    return this.height;
  }

  public int getWeight() {
    return this.weight;
  }

  @Override
  public String toString() {
    return String.format("%1(%2,%3,%4,%5)",
      getClass().getName(), name, age, height, weight);
  }

(つづき)

  @Override
  public boolean equals(Object o) {
    if(o instanceof Person) {
      Person p = (Person)o;
      return
        ((this.name==null&&p.name==null) ||
          this.name.compareTo(p.name) == 0) &&
        this.age == p.age &&
        this.height == p.height &&
        this.weight == p.weight;
    } else {
      return false;
    }
  }

(つづき)

  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    result = prime * result + age;
    result = prime * result + height;
    result = prime * result + weight;
    return result;
  }
}
  • 60行

Scala言語 超概要

Personクラス(Scala)

case class Person(name: String, age: Int, height: Int, weight: Int)
  • 以上

  • たった1行


60行がたった1行に!?


生産性60倍!!!


60倍速開発が可能!!!!


すみません調子のりすぎました


Pointクラス(case class版)

case class Point(x: Int, y: Int) {
  def move(dx: Int, dy: Int) =
    Point(x + dx, y + dy)
}
  • その他 copyメソッドなども実装される
val p = Point(2, 3)
p.move(1, 0)   // == Point(3, 3)を返す
p.copy(y = 5)  // == Point(2, 5)を返す
p.toString      // "Point(2,3)"

便利!


コレクション

collection framework


関数型プログラミング

の初歩


関数型言語とは


関数型プログラミングの初歩

関数とは

  • 数学的なこういうの

     y = f(x)
    
  • ある値xに対し常におなじyが返る (純粋関数、参照透過性)

    • JavascriptやC言語の関数とは違う
  • イメージ(あくまで図だけ参考)


関数型プログラミングの初歩

モジュール性

(一般的に言われている性質です)

  • 第一級関数
    • 高階関数
  • 参照透過
  • イミュータブル(副作用が分離されている)

関数型プログラミングの初歩

モジュール性

  • 関数を組み合わせるための機能が充実
    • 細かいことは後で説明します
// 関数
val birthDate: Person => Date = { ... }
val eto: Date => Eto = { ... }

// 関数を適用
val etolist = persons.map(birthDate).map(eto)

// 関数を合成
val person2eto = birthDate.compose(eto)

val etolist2 = persons.map(person2eto)

この辺からデモを交えて

  • demo1

    • Scala言語や標準ライブラリの機能ちょろっと紹介
  • demo2 ( 時間があれば)

    • selenium DSL
    • Play Framework2 の概要

demo1

  • sbt
  • REPL
  • 純粋オブジェクト指向
2 + 3 == 2.+(3)

val f = (x:Int) => x * 2
  • 有理数の実装サンプル: rational.scala

    • 基本コンストラクタ, 型推論, 末尾再帰最適化
    • String補間子, 演算子オーバロード など
  • 直和型のサンプル: os.scala

    • caseクラス, パターンマッチ

demo1(cont.)

  • エラー処理
val map = Map(1 -> "one", 2 -> "two")
val value = map.get(3)

// pattern match
def f(i: Int) = map.get(i) match {
  case Some(s) => s
  case None => i.toString
}

map.get(100).getOrElse("none")
  • エラー処理2
import scala.util.control.Exception._

val toInt = (str: String) =>
  catching(classOf[NumberFormatException]) opt str.toInt

val a = (opt: Option[String]) =>
  opt.flatMap(toInt).filter(_>=0).getOrElse(-1)
  • エラー処理3
// Eitherのこと

demo1(cont.)

  • コレクションの使用例: person.scala bmi.scala

    • map, filter
    • 高階関数, 部分適用
  • Listの構造

1 :: 2 :: 3 :: Nil
1 :: (2 :: (3 :: Nil))
  • (時間があれば)さらなる?コレクションの使用例: coll.scala
    • head, tail
    • reduce, fold

demo2(時間があれば)

  • selenium dsl
    • DSL
    • 暗黙の型変換、その他implicitなもの
  • Play Framework2
    • routes/controller/viewくらいまで

説明しなかったこと

(説明できないものも含む)

  • Scalaのその他の機能いろいろ
    • variance 、for comprehension, self-type annotation ...
    • 遅延評価、並行・並列プログラミング、パーサ・コンビネータ、...
    • マクロ...
  • Unit Testing
    • scalatest, specs2 ...
  • IDE
    • Intellij IDEA, Scala-IDE (eclipse plugin)
  • 関数型プログラミングのちゃんとした説明とかモナドみたいなものとか
  • フレームワーク・ライブラリなど
    • Play Framework2のその他機能
    • Play以外のWeb(scalatra, unfiltered)
    • MR(Spark)
    • 分散並行処理(Akka )
    • scalaz
    • AltJS(scala.js)

学習リソース

(テキトーにリスト化)


おわり

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment