- 関数型とオブジェクト指向
| ★オブジェクト指向 |
+--------+-----+------+
|命令型(手続型)| 論理型 | ★関数型 |
- Martin Odersky先生
- Java5のGenerics設計者 JSR-14
- 1995年登場
- C++言語に意図的に似せた言語仕様
- 後方互換性の呪縛
- 後発の言語の進化に追従できてない(やっとJava8で並んだ。か?)
- Java(言語)は古い が、
- Java VMはイケてる
- マルチプラットフォーム
- GC
- Hotspot
- 実行時最適化
- デバッガ、プロファイラなどのツール
- Better Javaとして(Groovy, Scalaとか)
- 他の言語のポーティング(JRuby, Clojure, Nashornとか)
- Javaじゃない言語だけど、コンパイルするとclassファイルになる(かインタプリタ)
- 現存するJavaライブラリなど資産の利用もOK
- 「JavaからRubyへ」いけなかった人
- 静的型付言語じゃないとチョット・・・
- JVM好きなので・・・
- Javaのライブラリ資産ガー
(屮゜Д゜)屮 < カモーン
class
はある。interface
はない。
- 実装を持てる
interface
的なもの - mix-inできる
trait Employee {
def work: Result
def salary: Money = { ... }
}
class Student extends Person with Employee with Logger {
debug("my salary is " + salary)
}
- singletonの言語的なサポート
object XmlParserFactory {
def parser: XmlParser = ...
}
// new 要らない
val parser = XmlParserFactory.parser()
def save(text: String,
encoding: String = "utf8",
newline: String = "LF",
color: String = "black") {
}
save("hello", "utf16")
save("hello", newline = "CRLF", color = "red")
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行
case class Person(name: String, age: Int, height: Int, weight: Int)
-
以上
-
たった1行
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)"
-
不変(immutable) immutable collections
- コンセンサスを得られた定義はない
- 参考:『関数型言語』を使ってはいけない@函数プログラミングの集い2012
- プログラミングスタイルの形容である
- 関数型言語 ×
- 関数型プログラミング ○
- 関数型言語=関数型プログラミングをしやすい言語
- (オブジェクト指向言語と同じ)
(一般的に言われている性質です)
- 第一級関数
- 高階関数
- 型
- 参照透過
- イミュータブル(副作用が分離されている)
- 関数を組み合わせるための機能が充実
- 細かいことは後で説明します
// 関数
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 の概要
- sbt
- REPL
- 純粋オブジェクト指向
2 + 3 == 2.+(3)
val f = (x:Int) => x * 2
-
有理数の実装サンプル:
rational.scala
- 基本コンストラクタ, 型推論, 末尾再帰最適化
- String補間子, 演算子オーバロード など
-
直和型のサンプル:
os.scala
- caseクラス, パターンマッチ
- エラー処理
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のこと
-
コレクションの使用例:
person.scala bmi.scala
- map, filter
- 高階関数, 部分適用
-
Listの構造
1 :: 2 :: 3 :: Nil
1 :: (2 :: (3 :: Nil))
- (時間があれば)さらなる?コレクションの使用例:
coll.scala
- head, tail
- reduce, fold
- 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)
(テキトーにリスト化)
-
コップ本
-
逆引きレシピ
-
Functional Programming in Scala
-
他にも書籍多数あり
-
coursera