Scalaz
-
Upload
kota-mizushima -
Category
Documents
-
view
6.852 -
download
6
description
Transcript of Scalaz
Scalaz
– とある型クラスのライブラリ-
水島 宏太
(@kmizu)
自己紹介
の前に
発表途中でも遠慮無く遠慮無く遠慮無く遠慮無く
(突っ込んで/質問)ください
@kmizu http://twitter.com/kmizu
id:kmizushima
http://d.hatena.ne.jp/kmizushima
他称 Scala Bot
去年まで大学院生(博士課程)
ブログで就活⇒今の会社に就職
運が良かった?
まだまだ新米
Scalaエヴァンジェリスト(笑)
Scalazについて話します
その前に
ちょっと待って
Scalazって何?
頭のおかしい(褒め言葉)
凄い人たちが作ったライブラリ
型クラス(Type Classes)
純粋関数型データ構造
(Pure Functional Data Structures)
最低限の依存関係
(J2SE + Scala標準ライブラリ)
IntelliJ IDEA使って開発してる
なんだか難しそう?
コード例
☆って何だよ☆って
★って何だよ★って
数学記号ならわかる
何故☆★?
あちこちでUnicode文字を使いまくり
向こうの人はどうやって入力しているのか
それが知りたい
ここから真面目に紹介
Scalazhttp://code.google.com/p/scalaz/
Scalaの標準ライブラリに無いあれこれを集めた
便利ライブラリ
パッケージ一覧
scalaz ←自分が紹介scalaz.effect↑@halcat0x15aさんが紹介scalaz.concurrentscalaz.ioscalaz.httpscalaz.geoscalaz.scalacheck
ググってください
scalazパッケージ
Scalazのコア
色々なtrait/class
の集まり
中心は
便利な型クラス &
それを利用した
ライブラリ
純粋関数型データ構造
(不変データ構造)
ライブラリ
CategoryApplicative
FunctorArrowKleisiMonoidMonad...
IOモナドまである
# Scalaで必要なのか…?
どういうバックグラウンドの人が作ったか
よくわかる
でも、この辺の用語は
わからなくてもOK
便利なとこだけ使おう
基本的な命名規約
とかコーディングルール
末尾にs
↓
implicit conversion
を提供するtrait
末尾にW
↓
implicit conversion
によって拡張するための型
PimpedType[T]を継承
わかりやすい例
scalaz.BooleanW
scalaz.Booleans
Boolean型に
便利?メソッドを追加
二つ揃って一人前
いいからコードを
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 }
...
import scalaz._
import Scalaz._
この二行だけで使える
他のをimportしなくていい
次
scalaz.Options
scalaz.OptionW
Option型に
便利?メソッドを追加
(ry
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
...
次
scalaz.Lists
scalaz.Listw
List型に
便利?メソッドを追加
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())
NonEmptyList ?
その名の通り
空(Nil)でない事が保証されているList
(のようなもの)
⇒ head, tail が必ず
成功する
reduceLeft,
reduceRightも同様
型安全性にとって重要
ところで
型クラスの話はどこ?
それは皆様の心の中に
というわけではなく
既に使っています
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
...
0相当の値(零元)を取得
型毎に「零」値は異なる
そもそも「零」が無い型も
どうやって「零」を取得?
というわけで
orZeroの定義を見る
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
Zero[Z]
零元を取得するためだけのtrait(型クラス)
trait Zero[Z] { val zero: Z }
ちょーシンプル
でも重要
色々な型クラス
Zero
Equal
Length
Semigroup
...
最初出てきた
CategoryApplicative
FunctorArrowKleisiMonoidMonad...
こいつらも型クラス
純粋関数型データ構造
要はimmutableな
データ構造
scala.collection.
immutableにあるようなの
immutableデータは効率が悪い?
必ずしもそうではない
でもその話は置いておく
Scalazが提供する
純粋関数型データ構造
Zipper
FingerTree
+ Rope
あんまり多く無い
標準コレクション
が充実してるせい(たぶん)
Zipper
一言で言うと
純粋関数型イテレータ
要素更新もO(1)で
できるよ!
とりあえずコードを(ry
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)
とりあえずコードを(ry
FingerTree
一言で言うと
cons, reverse, cdr: O(1)
append, split: O(log n)
※償却計算量
例は省略
他にも色々ある
でも時間が
というわけでひとまず終了
ご静聴
ありがとうございました
質問タイム?