Scalaz

7,687 views
7,556 views

Published on

An introduction to Sca

0 Comments
16 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,687
On SlideShare
0
From Embeds
0
Number of Embeds
292
Actions
Shares
0
Downloads
40
Comments
0
Likes
16
Embeds 0
No embeds

No notes for slide

Scalaz

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

×