Implicit Implicit Scala

2,708 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,708
On SlideShare
0
From Embeds
0
Number of Embeds
98
Actions
Shares
0
Downloads
6
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Implicit Implicit Scala

  1. 1. Implicit Implicit Scala(あるいは bpstudy #49の補足) 水島 宏太 (@kmizu)
  2. 2. 自己紹介
  3. 3. @kmizu http://twitter.com/kmizu @ktmizushima (English) http://twitter.com/ktmizushima id:kmizushimahttp://d.hatena.ne.jp/kmizushima Scala辻斬り ヒーラー
  4. 4. 今回説明すること
  5. 5. implicit parameter/conversion
  6. 6. この二つの関係
  7. 7. に関する正しい理解
  8. 8. implicit parameter入門は
  9. 9. http://www.slideshare.net/kmizushima/implicit-explicit-scala
  10. 10. 参照してください
  11. 11. とりあえず世間的(?)な認識
  12. 12. (A), (B) の方対象に説明(A). 区別が付かない。ごっちゃになっている(B). implicit parameter重要。二つは別物(C). なんか黒魔術っぽい
  13. 13. implicit conversionの基本形(誤)
  14. 14. implicit def aToB(a: A): B = ...
  15. 15. implicit conversionの基本形(正)
  16. 16. implicit val aToB: A => B = {a => ... }implicit value aToB: A => Bを定義
  17. 17. Why?
  18. 18. Scala Language Specification (2.9.0)7.3 Views(p.193) より引用• Implicit parameters and methods can also define implicit conversions called views.• A view from type S to type T is defined by an implicit value which has function type S=>T or (=>S)=>T or by a method convertible to a value of that type.
  19. 19. implicit def ... でconversionを定義できるのはmethod type: (A) B function type: (A => B)への変換が可能だと言語仕様で規定されているため
  20. 20. 基本形はあくまで
  21. 21. implicit val aToB: A => B = {a => ... }
  22. 22. 何が言いたい?
  23. 23. implicit conversion ⊂ implicit parameter
  24. 24. implicit conversionは
  25. 25. implicit parameterの枠組みの 中で定義されている
  26. 26. implicit valueの中で 単に A => B 型(or それに変換可能なメソッド型) を持ったものがものが implicit conversion
  27. 27.
  28. 28. implicit val i2s: Int => String = _.toString1234.substring(1) "234"
  29. 29. def getOrdered[A](a: A)(implicit f: A => Ordered[A]): Ordered[A] = a // a f(a) // implicit conversion is appliedgetOrdered(100) Ordered[Int]
  30. 30. 説明は以上
  31. 31. ちょっとした応用例
  32. 32. recursive implicit conversion (parameter)
  33. 33. class DepthCalculator[M[_]] { implicit def to0[T](k: T): Int = 0 implicit def toN[T](k: M[T])(implicit f: T => Int) :Int = f(null.asInstanceOf[T]) + 1 def depth[T](implicit fn: T => Int) = fn(null.asInstanceOf[T])}implicit val calculator = new DepthCalculator[Array]import calculator._println(depth[String]) 0println(depth[Array[String]]) 1println(depth[Array[Array[String]]]) 2println(depth[Array[Array[Array[String]]]]) 3
  34. 34. 無限に展開が続く場合
  35. 35. コンパイルエラー
  36. 36. ご静聴?ありがとう ございました
  37. 37. 通称コップ本 第二版 好評発売中Scala 2.8対応+付録Scala 2.9記事(by @kmizu)
  38. 38. 宣伝(2)
  39. 39. こんなキーワードにピンと来たら(ry Cakeパターン, CONCEPTパターン, 限定継続 現場でのScala, Javaとの連携

×