Your SlideShare is downloading. ×
  • Like
Scalaz
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Scalaz

  • 6,559 views
Published

An introduction to Sca

An introduction to Sca

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
6,559
On SlideShare
0
From Embeds
0
Number of Embeds
3

Actions

Shares
Downloads
37
Comments
0
Likes
14

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Scalaz– とある型クラスのライブラリ- 水島 宏太 (@kmizu)
  • 2. 自己紹介
  • 3. の前に
  • 4. 発表途中でも遠慮無く(突っ込んで/質問)ください
  • 5. @kmizu http://twitter.com/kmizu id:kmizushimahttp://d.hatena.ne.jp/kmizushima 他称 Scala Bot
  • 6. 去年まで大学院生(博士課程)
  • 7. ブログで就活⇒今の会社に就職 運が良かった?
  • 8. まだまだ新米
  • 9. Scalaエヴァンジェリスト(笑)
  • 10. Scalazについて話します
  • 11. その前に
  • 12. ちょっと待って
  • 13. Scalazって何?
  • 14. 頭のおかしい(褒め言葉)凄い人たちが作ったライブラリ
  • 15. 型クラス(Type Classes)
  • 16. 純粋関数型データ構造(Pure Functional Data Structures)
  • 17. 最低限の依存関係(J2SE + Scala標準ライブラリ)
  • 18. IntelliJ IDEA使って開発してる
  • 19. なんだか難しそう?
  • 20. コード例
  • 21. ☆って何だよ☆って
  • 22. ★って何だよ★って
  • 23. 数学記号ならわかる
  • 24. 何故☆★?
  • 25. あちこちでUnicode文字を 使いまくり
  • 26. 向こうの人はどうやって入 力しているのか
  • 27. それが知りたい
  • 28. ここから真面目に紹介
  • 29. Scalazhttp://code.google.com/p/scalaz/
  • 30. Scalaの標準ライブラリに 無いあれこれを集めた 便利ライブラリ
  • 31. パッケージ一覧scalaz ←自分が紹介scalaz.effect↑@halcat0x15aさんが紹介scalaz.concurrentscalaz.ioscalaz.http ググってくださいscalaz.geoscalaz.scalacheck
  • 32. scalazパッケージ
  • 33. Scalazのコア
  • 34. 色々なtrait/class の集まり
  • 35. 中心は
  • 36. 便利な型クラス & それを利用した ライブラリ
  • 37. 純粋関数型データ構造 (不変データ構造) ライブラリ
  • 38. CategoryApplicative Functor Arrow Kleisi Monoid Monad ...
  • 39. IOモナドまである# Scalaで必要なのか…?
  • 40. どういうバックグラウンド の人が作ったか よくわかる
  • 41. でも、この辺の用語は わからなくてもOK
  • 42. 便利なとこだけ使おう
  • 43. 基本的な命名規約とかコーディングルール
  • 44. 末尾にs ↓implicit conversion を提供するtrait
  • 45. 末尾にW ↓ implicit conversionによって拡張するための型 PimpedType[T]を継承
  • 46. わかりやすい例
  • 47. scalaz.BooleanWscalaz.Booleans
  • 48. Boolean型に便利?メソッドを追加
  • 49. 二つ揃って一人前
  • 50. いいからコードを
  • 51. import scalaz._ import Scalaz._ var i = 1 i < 3 ∧ i > 0 truei < 1 ∨ i == 1 true i == 1 when { i+= 1 } (i < 3).guard[List](1)i != 2 unless { i+= 1 } ...
  • 52. import scalaz._import Scalaz._
  • 53. この二行だけで使える
  • 54. 他のをimportしなくていい
  • 55.
  • 56. scalaz.Optionsscalaz.OptionW
  • 57. Option型に便利?メソッドを追加
  • 58. (ry
  • 59. 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...
  • 60.
  • 61. scalaz.Listsscalaz.Listw
  • 62. List型に便利?メソッドを追加
  • 63. 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())
  • 64. NonEmptyList ?
  • 65. その名の通り
  • 66. 空(Nil)でない事が保証さ れているList (のようなもの)
  • 67. ⇒ head, tail が必ず 成功する reduceLeft, reduceRightも同様型安全性にとって重要
  • 68. ところで
  • 69. 型クラスの話はどこ?
  • 70. それは皆様の心の中に
  • 71. というわけではなく
  • 72. 既に使っています
  • 73. 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...
  • 74. 0相当の値(零元)を取得
  • 75. 型毎に「零」値は異なる
  • 76. そもそも「零」が無い型も
  • 77. どうやって「零」を取得?
  • 78. というわけで
  • 79. orZeroの定義を見る
  • 80. 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
  • 81. Zero[Z]
  • 82. 零元を取得するためだけの trait(型クラス)
  • 83. trait Zero[Z] { val zero: Z }
  • 84. ちょーシンプル
  • 85. でも重要
  • 86. 色々な型クラス
  • 87. Zero Equal LengthSemigroup ...
  • 88. 最初出てきた
  • 89. CategoryApplicative Functor Arrow Kleisi Monoid Monad ...
  • 90. こいつらも型クラス
  • 91. 純粋関数型データ構造
  • 92. 要はimmutableな データ構造
  • 93. scala.collection.immutableにあるようなの
  • 94. immutableデータは効率が 悪い?
  • 95. 必ずしもそうではない
  • 96. でもその話は置いておく
  • 97. Scalazが提供する純粋関数型データ構造
  • 98. ZipperFingerTree + Rope
  • 99. あんまり多く無い
  • 100. 標準コレクションが充実してるせい(たぶん)
  • 101. Zipper
  • 102. 一言で言うと
  • 103. 純粋関数型イテレータ 要素更新もO(1)で できるよ!
  • 104. とりあえずコードを(ry
  • 105. 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)
  • 106. とりあえずコードを(ry
  • 107. FingerTree
  • 108. 一言で言うと
  • 109. cons, reverse, cdr: O(1) append, split: O(log n) ※償却計算量
  • 110. 例は省略
  • 111. 他にも色々ある
  • 112. でも時間が
  • 113. というわけでひとまず終了
  • 114. ご静聴ありがとうございました
  • 115. 質問タイム?