SlideShare ist ein Scribd-Unternehmen logo
1 von 118
Downloaden Sie, um offline zu lesen
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文字を
   使いまくり
向こうの人はどうやって入
   力しているのか
それが知りたい
ここから真面目に紹介
Scalaz
http://code.google.com/p/scalaz/
Scalaの標準ライブラリに
  無いあれこれを集めた
    便利ライブラリ
パッケージ一覧
scalaz ←自分が紹介
scalaz.effect
↑@halcat0x15aさんが紹介
scalaz.concurrent
scalaz.io
scalaz.http      ググってください



scalaz.geo
scalaz.scalacheck
scalazパッケージ
Scalazのコア
色々なtrait/class
  の集まり
中心は
便利な型クラス &
 それを利用した
  ライブラリ
純粋関数型データ構造
 (不変データ構造)
   ライブラリ
Category
Applicative
  Functor
   Arrow
   Kleisi
   Monoid
   Monad
    ...
IOモナドまである
# Scalaで必要なのか…?
どういうバックグラウンド
   の人が作ったか
    よくわかる
でも、この辺の用語は
 わからなくてもOK
便利なとこだけ使おう
基本的な命名規約
とかコーディングルール
末尾にs
        ↓
implicit conversion
  を提供するtrait
末尾にW
         ↓
 implicit conversion
によって拡張するための型
 PimpedType[T]を継承
わかりやすい例
scalaz.BooleanW
scalaz.Booleans
Boolean型に
便利?メソッドを追加
二つ揃って一人前
いいからコードを
import scalaz._
    import Scalaz._

       var i = 1
 i < 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] = None
val k: Option[Double] = Some(50.0)
val l: Option[Double] = None
i.orZero    100
j.orZero    0
k.orZero    50.0
l.orZero    0.0
i.orEmpty[List]    List(100)
j.orEmpty[List]    List()
k.orEmpty[Vector]    Vector(100)
l.orEmpty[Vector]    Vector()
i | 200    100
j | 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] = None
val k: Option[Double] = Some(50.0)
val l: Option[Double] = None
i.orZero    100
j.orZero    0
k.orZero    50.0
l.orZero    0.0
i.orEmpty[List]    List(100)
j.orEmpty[List]    List()
k.orEmpty[Vector]    Vector(100)
l.orEmpty[Vector]    Vector()
i | 200    100
j | 200    200
...
0相当の値(零元)を取得
型毎に「零」値は異なる
そもそも「零」が無い型も
どうやって「零」を取得?
というわけで
orZeroの定義を見る
Zero[A
                               [A]):
  def unary_~(implicit z: Zero[A]): A =
        value getOrElse z.zero
                       Zero[A
                           [A]):
def orZero(implicit z: Zero[A]): A = ~this
Zero[Z]
零元を取得するためだけの
   trait(型クラス)
trait Zero[Z] { val zero: Z }
ちょーシンプル
でも重要
色々な型クラス
Zero
  Equal
 Length
Semigroup
   ...
最初出てきた
Category
Applicative
  Functor
   Arrow
   Kleisi
   Monoid
   Monad
    ...
こいつらも型クラス
純粋関数型データ構造
要はimmutableな
 データ構造
scala.collection.
immutableにあるようなの
immutableデータは効率が
         悪い?
必ずしもそうではない
でもその話は置いておく
Scalazが提供する
純粋関数型データ構造
Zipper
FingerTree
  + Rope
あんまり多く無い
標準コレクション
が充実してるせい(たぶん)
Zipper
一言で言うと
純粋関数型イテレータ
 要素更新もO(1)で
  できるよ!
とりあえずコードを(ry
val list = List(1,2,3)
val zipper = list.toZipper.get.tryNext
val 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)
     ※償却計算量
例は省略
他にも色々ある
でも時間が
というわけでひとまず終了
ご静聴
ありがとうございました
質問タイム?

Weitere ähnliche Inhalte

Was ist angesagt?

Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Ra Zon
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Naoki Aoyama
 
AuxパターンをDottyで解決する
AuxパターンをDottyで解決するAuxパターンをDottyで解決する
AuxパターンをDottyで解決するTaisuke Oe
 
Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門yujiro_t
 
磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!Ra Zon
 

Was ist angesagt? (8)

Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
Scalaノススメ
ScalaノススメScalaノススメ
Scalaノススメ
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術
 
Phantom Type in Scala
Phantom Type in ScalaPhantom Type in Scala
Phantom Type in Scala
 
AuxパターンをDottyで解決する
AuxパターンをDottyで解決するAuxパターンをDottyで解決する
AuxパターンをDottyで解決する
 
Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門
 
null使ったら負け福岡版
null使ったら負け福岡版null使ったら負け福岡版
null使ったら負け福岡版
 
磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!
 

Andere mochten auch

実務者のためのかんたんScalaz
実務者のためのかんたんScalaz実務者のためのかんたんScalaz
実務者のためのかんたんScalazTomoharu ASAMI
 
Twitter4JとScalaと何か
Twitter4JとScalaと何かTwitter4JとScalaと何か
Twitter4JとScalaと何かYusuke Yamamoto
 
Cleaner scala stack
Cleaner scala stackCleaner scala stack
Cleaner scala stackosamu kimura
 
第一回Scala会議
第一回Scala会議第一回Scala会議
第一回Scala会議潤一 加藤
 
Java Annotation
Java AnnotationJava Annotation
Java Annotationip-imamoto
 
ファントムファイル
ファントムファイルファントムファイル
ファントムファイルAkura Pi
 
(Unityよくわかってない人のための)なんとなくわかるかもしれないAssetBundle
(Unityよくわかってない人のための)なんとなくわかるかもしれないAssetBundle(Unityよくわかってない人のための)なんとなくわかるかもしれないAssetBundle
(Unityよくわかってない人のための)なんとなくわかるかもしれないAssetBundleYusuke HIDESHIMA
 

Andere mochten auch (9)

実務者のためのかんたんScalaz
実務者のためのかんたんScalaz実務者のためのかんたんScalaz
実務者のためのかんたんScalaz
 
Twitter4JとScalaと何か
Twitter4JとScalaと何かTwitter4JとScalaと何か
Twitter4JとScalaと何か
 
Cleaner scala stack
Cleaner scala stackCleaner scala stack
Cleaner scala stack
 
第一回Scala会議
第一回Scala会議第一回Scala会議
第一回Scala会議
 
ScalaCL in ScalaKaigi
ScalaCL in ScalaKaigiScalaCL in ScalaKaigi
ScalaCL in ScalaKaigi
 
scala-kaigi1-sbt
scala-kaigi1-sbtscala-kaigi1-sbt
scala-kaigi1-sbt
 
Java Annotation
Java AnnotationJava Annotation
Java Annotation
 
ファントムファイル
ファントムファイルファントムファイル
ファントムファイル
 
(Unityよくわかってない人のための)なんとなくわかるかもしれないAssetBundle
(Unityよくわかってない人のための)なんとなくわかるかもしれないAssetBundle(Unityよくわかってない人のための)なんとなくわかるかもしれないAssetBundle
(Unityよくわかってない人のための)なんとなくわかるかもしれないAssetBundle
 

Ähnlich wie Scalaz

Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜Hiromi Ishii
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門Makoto Fukuhara
 
Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編takeuchi-tk
 

Ähnlich wie Scalaz (9)

Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
Rpscala2011 0601
Rpscala2011 0601Rpscala2011 0601
Rpscala2011 0601
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門
 
Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編
 

Mehr von Kota Mizushima

ドワンゴにおける新卒エンジニア向けScala研修について
ドワンゴにおける新卒エンジニア向けScala研修についてドワンゴにおける新卒エンジニア向けScala研修について
ドワンゴにおける新卒エンジニア向けScala研修についてKota Mizushima
 
株式会社ドワンゴにおけるScala教育の現状
株式会社ドワンゴにおけるScala教育の現状株式会社ドワンゴにおけるScala教育の現状
株式会社ドワンゴにおけるScala教育の現状Kota Mizushima
 
Scala Daysに行ってみて - あるいはスイス旅行記 -
Scala Daysに行ってみて - あるいはスイス旅行記 -Scala Daysに行ってみて - あるいはスイス旅行記 -
Scala Daysに行ってみて - あるいはスイス旅行記 -Kota Mizushima
 
Scalaの現状と今後
Scalaの現状と今後Scalaの現状と今後
Scalaの現状と今後Kota Mizushima
 
Scala Performance Tuning Tips
Scala Performance Tuning TipsScala Performance Tuning Tips
Scala Performance Tuning TipsKota Mizushima
 
こわくない型クラス
こわくない型クラスこわくない型クラス
こわくない型クラスKota Mizushima
 
About Capabilities for Uniqueness and Borrowing
About Capabilities for Uniqueness and BorrowingAbout Capabilities for Uniqueness and Borrowing
About Capabilities for Uniqueness and BorrowingKota Mizushima
 
Scala Macros makes it easy to provide useful libraries
Scala Macros makes it easy to provide useful librariesScala Macros makes it easy to provide useful libraries
Scala Macros makes it easy to provide useful librariesKota Mizushima
 
Scala + Finagleの魅力
Scala + Finagleの魅力Scala + Finagleの魅力
Scala + Finagleの魅力Kota Mizushima
 
Scalaの現状と課題
Scalaの現状と課題Scalaの現状と課題
Scalaの現状と課題Kota Mizushima
 
Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発Kota Mizushima
 
日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足Kota Mizushima
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit ScalaKota Mizushima
 
Implicit Explicit Scala
Implicit Explicit ScalaImplicit Explicit Scala
Implicit Explicit ScalaKota Mizushima
 

Mehr von Kota Mizushima (20)

ドワンゴにおける新卒エンジニア向けScala研修について
ドワンゴにおける新卒エンジニア向けScala研修についてドワンゴにおける新卒エンジニア向けScala研修について
ドワンゴにおける新卒エンジニア向けScala研修について
 
kollectionの紹介
kollectionの紹介kollectionの紹介
kollectionの紹介
 
株式会社ドワンゴにおけるScala教育の現状
株式会社ドワンゴにおけるScala教育の現状株式会社ドワンゴにおけるScala教育の現状
株式会社ドワンゴにおけるScala教育の現状
 
Macros in nemerle
Macros in nemerleMacros in nemerle
Macros in nemerle
 
Scala Daysに行ってみて - あるいはスイス旅行記 -
Scala Daysに行ってみて - あるいはスイス旅行記 -Scala Daysに行ってみて - あるいはスイス旅行記 -
Scala Daysに行ってみて - あるいはスイス旅行記 -
 
Introduction to PEG
Introduction to PEGIntroduction to PEG
Introduction to PEG
 
Scalaの現状と今後
Scalaの現状と今後Scalaの現状と今後
Scalaの現状と今後
 
Power of Scala
Power of ScalaPower of Scala
Power of Scala
 
Scala Performance Tuning Tips
Scala Performance Tuning TipsScala Performance Tuning Tips
Scala Performance Tuning Tips
 
こわくない型クラス
こわくない型クラスこわくない型クラス
こわくない型クラス
 
こわくないScala
こわくないScalaこわくないScala
こわくないScala
 
Scala is-unscared
Scala is-unscaredScala is-unscared
Scala is-unscared
 
About Capabilities for Uniqueness and Borrowing
About Capabilities for Uniqueness and BorrowingAbout Capabilities for Uniqueness and Borrowing
About Capabilities for Uniqueness and Borrowing
 
Scala Macros makes it easy to provide useful libraries
Scala Macros makes it easy to provide useful librariesScala Macros makes it easy to provide useful libraries
Scala Macros makes it easy to provide useful libraries
 
Scala + Finagleの魅力
Scala + Finagleの魅力Scala + Finagleの魅力
Scala + Finagleの魅力
 
Scalaの現状と課題
Scalaの現状と課題Scalaの現状と課題
Scalaの現状と課題
 
Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発
 
日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足日本Scalaユーザーズグループ発足
日本Scalaユーザーズグループ発足
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit Scala
 
Implicit Explicit Scala
Implicit Explicit ScalaImplicit Explicit Scala
Implicit Explicit Scala
 

Scalaz