Scalaz

118
Scalaz とある型クラスのライブラリ- 水島 宏太 (@kmizu)

description

An introduction to Sca

Transcript of Scalaz

Page 1: Scalaz

Scalaz

– とある型クラスのライブラリ-

水島 宏太

(@kmizu)

Page 2: Scalaz

自己紹介

Page 3: Scalaz

の前に

Page 4: Scalaz

発表途中でも遠慮無く遠慮無く遠慮無く遠慮無く

(突っ込んで/質問)ください

Page 5: Scalaz

@kmizu http://twitter.com/kmizu

id:kmizushima

http://d.hatena.ne.jp/kmizushima

他称 Scala Bot

Page 6: Scalaz

去年まで大学院生(博士課程)

Page 7: Scalaz

ブログで就活⇒今の会社に就職

運が良かった?

Page 8: Scalaz

まだまだ新米

Page 9: Scalaz

Scalaエヴァンジェリスト(笑)

Page 10: Scalaz

Scalazについて話します

Page 11: Scalaz

その前に

Page 12: Scalaz

ちょっと待って

Page 13: Scalaz

Scalazって何?

Page 14: Scalaz

頭のおかしい(褒め言葉)

凄い人たちが作ったライブラリ

Page 15: Scalaz
Page 16: Scalaz

型クラス(Type Classes)

Page 17: Scalaz

純粋関数型データ構造

(Pure Functional Data Structures)

Page 18: Scalaz

最低限の依存関係

(J2SE + Scala標準ライブラリ)

Page 19: Scalaz

IntelliJ IDEA使って開発してる

Page 20: Scalaz

なんだか難しそう?

Page 21: Scalaz

コード例

Page 22: Scalaz
Page 23: Scalaz

☆って何だよ☆って

Page 24: Scalaz
Page 25: Scalaz

★って何だよ★って

Page 26: Scalaz

数学記号ならわかる

Page 27: Scalaz

何故☆★?

Page 28: Scalaz

あちこちでUnicode文字を使いまくり

Page 29: Scalaz

向こうの人はどうやって入力しているのか

Page 30: Scalaz

それが知りたい

Page 31: Scalaz

ここから真面目に紹介

Page 32: Scalaz

Scalazhttp://code.google.com/p/scalaz/

Page 33: Scalaz

Scalaの標準ライブラリに無いあれこれを集めた

便利ライブラリ

Page 34: Scalaz

パッケージ一覧

scalaz ←自分が紹介scalaz.effect↑@halcat0x15aさんが紹介scalaz.concurrentscalaz.ioscalaz.httpscalaz.geoscalaz.scalacheck

ググってください

Page 35: Scalaz

scalazパッケージ

Page 36: Scalaz

Scalazのコア

Page 37: Scalaz

色々なtrait/class

の集まり

Page 38: Scalaz

中心は

Page 39: Scalaz

便利な型クラス &

それを利用した

ライブラリ

Page 40: Scalaz

純粋関数型データ構造

(不変データ構造)

ライブラリ

Page 41: Scalaz

CategoryApplicative

FunctorArrowKleisiMonoidMonad...

Page 42: Scalaz

IOモナドまである

# Scalaで必要なのか…?

Page 43: Scalaz

どういうバックグラウンドの人が作ったか

よくわかる

Page 44: Scalaz

でも、この辺の用語は

わからなくてもOK

Page 45: Scalaz

便利なとこだけ使おう

Page 46: Scalaz

基本的な命名規約

とかコーディングルール

Page 47: Scalaz

末尾にs

implicit conversion

を提供するtrait

Page 48: Scalaz

末尾にW

implicit conversion

によって拡張するための型

PimpedType[T]を継承

Page 49: Scalaz

わかりやすい例

Page 50: Scalaz

scalaz.BooleanW

scalaz.Booleans

Page 51: Scalaz

Boolean型に

便利?メソッドを追加

Page 52: Scalaz

二つ揃って一人前

Page 53: Scalaz

いいからコードを

Page 54: Scalaz

import scalaz._import Scalaz._

var i = 1i < 3 ∧ i > 0 � true

i < 1 ∨ i == 1 � true

i == 1 when { i+= 1 }(i < 3).guard[List](1)i != 2 unless { i+= 1 }

...

Page 55: Scalaz

import scalaz._

import Scalaz._

Page 56: Scalaz

この二行だけで使える

Page 57: Scalaz

他のをimportしなくていい

Page 58: Scalaz

Page 59: Scalaz

scalaz.Options

scalaz.OptionW

Page 60: Scalaz

Option型に

便利?メソッドを追加

Page 61: Scalaz

(ry

Page 62: Scalaz

val i: Option[Int] = Some(100)val j: Option[Int] = Noneval k: Option[Double] = Some(50.0)val l: Option[Double] = Nonei.orZero � 100j.orZero � 0k.orZero � 50.0l.orZero � 0.0i.orEmpty[List] � List(100)j.orEmpty[List] � List()k.orEmpty[Vector] � Vector(100)l.orEmpty[Vector] � Vector()i | 200 � 100j | 200 � 200

...

Page 63: Scalaz

Page 64: Scalaz

scalaz.Lists

scalaz.Listw

Page 65: Scalaz

List型に

便利?メソッドを追加

Page 66: Scalaz

import scalaz._

import Scalaz._

val lst = List(1, 2, 3)

lst.toNel � Some(NonEmptyList(1, 2, 3))

lst.powerset � List(List(1, 2, 3), List(1, 2), ...)

lst.filterM{x => Set(x < 3)} � Set(List(1, 2))

lst.filterM{x => Set(x < 2)} � Set(List(1))

lst.tails.toList � List(List(1, 2, 3), ...,List())

Page 67: Scalaz

NonEmptyList ?

Page 68: Scalaz

その名の通り

Page 69: Scalaz

空(Nil)でない事が保証されているList

(のようなもの)

Page 70: Scalaz

⇒ head, tail が必ず

成功する

reduceLeft,

reduceRightも同様

型安全性にとって重要

Page 71: Scalaz

ところで

Page 72: Scalaz

型クラスの話はどこ?

Page 73: Scalaz

それは皆様の心の中に

Page 74: Scalaz

というわけではなく

Page 75: Scalaz

既に使っています

Page 76: Scalaz

val i: Option[Int] = Some(100)val j: Option[Int] = Noneval k: Option[Double] = Some(50.0)val l: Option[Double] = Nonei.orZeroi.orZeroi.orZeroi.orZero � 100j.orZeroj.orZeroj.orZeroj.orZero � 0k.orZerok.orZerok.orZerok.orZero � 50.0l.orZerol.orZerol.orZerol.orZero � 0.0i.orEmpty[List] � List(100)j.orEmpty[List] � List()k.orEmpty[Vector] � Vector(100)l.orEmpty[Vector] � Vector()i | 200 � 100j | 200 � 200

...

Page 77: Scalaz

0相当の値(零元)を取得

Page 78: Scalaz

型毎に「零」値は異なる

Page 79: Scalaz

そもそも「零」が無い型も

Page 80: Scalaz

どうやって「零」を取得?

Page 81: Scalaz

というわけで

Page 82: Scalaz

orZeroの定義を見る

Page 83: Scalaz

def def def def unary_~(implicitunary_~(implicitunary_~(implicitunary_~(implicit z: z: z: z: ZeroZeroZeroZero[A[A[A[A]): ]): ]): ]): AAAA = = = = valuevaluevaluevalue getOrElsegetOrElsegetOrElsegetOrElse zzzz....zerozerozerozero

def def def def orZero(implicitorZero(implicitorZero(implicitorZero(implicit z: z: z: z: ZeroZeroZeroZero[A[A[A[A]): ]): ]): ]): AAAA = = = = ~~~~thisthisthisthis

Page 84: Scalaz

Zero[Z]

Page 85: Scalaz

零元を取得するためだけのtrait(型クラス)

Page 86: Scalaz

trait Zero[Z] { val zero: Z }

Page 87: Scalaz

ちょーシンプル

Page 88: Scalaz

でも重要

Page 89: Scalaz

色々な型クラス

Page 90: Scalaz

Zero

Equal

Length

Semigroup

...

Page 91: Scalaz

最初出てきた

Page 92: Scalaz

CategoryApplicative

FunctorArrowKleisiMonoidMonad...

Page 93: Scalaz

こいつらも型クラス

Page 94: Scalaz

純粋関数型データ構造

Page 95: Scalaz

要はimmutableな

データ構造

Page 96: Scalaz

scala.collection.

immutableにあるようなの

Page 97: Scalaz

immutableデータは効率が悪い?

Page 98: Scalaz

必ずしもそうではない

Page 99: Scalaz

でもその話は置いておく

Page 100: Scalaz

Scalazが提供する

純粋関数型データ構造

Page 101: Scalaz

Zipper

FingerTree

+ Rope

Page 102: Scalaz

あんまり多く無い

Page 103: Scalaz

標準コレクション

が充実してるせい(たぶん)

Page 104: Scalaz

Zipper

Page 105: Scalaz

一言で言うと

Page 106: Scalaz

純粋関数型イテレータ

要素更新もO(1)で

できるよ!

Page 107: Scalaz

とりあえずコードを(ry

Page 108: Scalaz

val list = List(1,2,3)val zipper = list.toZipper.get.tryNextval updated = zipper.insert(10).insert(20)updated.toStream.toList // List(1,2,10,20,3)

Page 109: Scalaz

とりあえずコードを(ry

Page 110: Scalaz

FingerTree

Page 111: Scalaz

一言で言うと

Page 112: Scalaz

cons, reverse, cdr: O(1)

append, split: O(log n)

※償却計算量

Page 113: Scalaz

例は省略

Page 114: Scalaz

他にも色々ある

Page 115: Scalaz

でも時間が

Page 116: Scalaz

というわけでひとまず終了

Page 117: Scalaz

ご静聴

ありがとうございました

Page 118: Scalaz

質問タイム?