Your SlideShare is downloading. ×
0
こわくない型クラス	
 
@kmizu	
 
Scala	
 Conference	
 in	
 Japan	
 2013	
 座長	
 
Scalaエヴァンジェリスト(に戻った?)
こわくない話
型クラスは怖くない	
 
型クラスは友達
本当に?
本当です(真顔)
簡単な例題
リストの要素を全て足し合わせた値を返
す関数
素直な解
def	
 sum(list:	
 List[Int]):	
 Int	
 =	
 
list.foldLeft(0)(_	
 +	
 _)
これでOK?
Intにしか適用できない
加算できる型ならなんでもsumしたい	
 
(Int,Long,Float,Doubleとか)
trait	
 Monoid[A]	
 {	
 
	
 	
 def	
 plus(x:	
 A,	
 y:	
 A):	
 A	
 
	
 	
 def	
 zero:	
 A	
 
}	
 
	
 
def	
 sum[A](list:	
...
ここまでが準備
object	
 IntMonoid	
 extends	
 Monoid[Int]	
 {	
 
	
 	
 def	
 plus(x:	
 Int,	
 y:	
 Int):	
 Int	
 =	
 x	
 +	
 y	
 
	
 	
 d...
object	
 DoubleMonoid	
 extends	
 Monoid[Double]	
 {	
 
	
 	
 def	
 plus(x:	
 Double,	
 y:	
 Double):	
 Double=	
 x	
 +	
 ...
やった!
毎回	
 XXXMonoid渡すの?
めんどくさい
その気持ちをわかって欲しい
気持ちを伝える方法
trait	
 Monoid[A]	
 {	
 
	
 	
 def	
 plus(x:	
 A,	
 y:	
 A):	
 A	
 
	
 	
 def	
 zero:	
 A	
 
}	
 
def	
 sum[A](list:	
 Lis...
implicit	
 object	
 DoubleMonoid	
 extends	
 
Monoid[Double]	
 {	
 
	
 	
 def	
 plus(x:	
 Double,	
 y:	
 Double):	
 Double...
sum(List(1,	
 2,	
 3,	
 4,	
 5))	
 //	
 ⇒	
 15	
 
sum(List(1.0,	
 2.0,	
 3.0.	
 4.0,	
 5.0))	
 //	
 ⇒	
 15.0
他の型のListもsumしたくなったら?
implicit	
 object	
 BooleanMonoid	
 extends	
 
Monoid[Boolean]	
 {	
 
	
 	
 def	
 plus(x:	
 Boolean,	
 y:	
 Boolean):	
 Bo...
話を戻します
めんどくさい	
 
	
 
def	
 sum[A](list:	
 List[A])(	
 
	
 	
 implicit	
 m:	
 Monoid[A]):	
 A	
 =	
 {	
 
	
 	
 list.foldLeft(m.zer...
def	
 sum[A:Monoid](list:	
 List[A]):	
 A	
 =	
 {	
 
	
 	
 list.foldLeft(m.zero)	
 {	
 case	
 (total,	
 e)	
 =>	
 
	
 	
 	...
型クラスという言葉	
 
出てきましたか?
Monoid[A]	
 みたいなのをScalaで	
 
型クラスと呼んでいるだけ	
 
厳密には説明の順番が逆だけどそこは気にしない
Haskellの型クラスも	
 
原理は同じ
Scalaでは	
 
少し中身が見えている
むしろわかりやすい
詳しく知りたい人向けの参考文献	
 
	
 
	
 
Martin	
 Odersky,	
 Poor	
 Man's	
 Type	
 Classes,	
 2006	
 
http://lampwww.epfl.ch/~odersky/ta...
Upcoming SlideShare
Loading in...5
×

こわくない型クラス

3,822

Published on

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

No Downloads
Views
Total Views
3,822
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
10
Comments
0
Likes
24
Embeds 0
No embeds

No notes for slide

Transcript of "こわくない型クラス"

  1. 1. こわくない型クラス @kmizu Scala Conference in Japan 2013 座長 Scalaエヴァンジェリスト(に戻った?)
  2. 2. こわくない話
  3. 3. 型クラスは怖くない 型クラスは友達
  4. 4. 本当に?
  5. 5. 本当です(真顔)
  6. 6. 簡単な例題
  7. 7. リストの要素を全て足し合わせた値を返 す関数
  8. 8. 素直な解
  9. 9. def sum(list: List[Int]): Int = list.foldLeft(0)(_ + _)
  10. 10. これでOK?
  11. 11. Intにしか適用できない
  12. 12. 加算できる型ならなんでもsumしたい (Int,Long,Float,Doubleとか)
  13. 13. trait Monoid[A] { def plus(x: A, y: A): A def zero: A } def sum[A](list: List[A])(m: Monoid[A]): A = { list.foldLeft(m.zero) { case (total, e) => m.plus(total, e) } }
  14. 14. ここまでが準備
  15. 15. object IntMonoid extends Monoid[Int] { def plus(x: Int, y: Int): Int = x + y def zero: Int = 0 } sum(List(1, 2, 3, 4))(IntMonoid)
  16. 16. object DoubleMonoid extends Monoid[Double] { def plus(x: Double, y: Double): Double= x + y def zero: Double = 0.0 } sum(List(1.0, 2.0, 3.0, 4.0))(DoubleMonoid)
  17. 17. やった!
  18. 18. 毎回 XXXMonoid渡すの?
  19. 19. めんどくさい
  20. 20. その気持ちをわかって欲しい
  21. 21. 気持ちを伝える方法
  22. 22. trait Monoid[A] { def plus(x: A, y: A): A def zero: A } def sum[A](list: List[A])( implicit m: Monoid[A]): A = { list.foldLeft(m.zero) { case (total, e) => m.plus(total, e) } }
  23. 23. implicit object DoubleMonoid extends Monoid[Double] { def plus(x: Double, y: Double): Double= x + y def zero: Double = 0.0 } implicit object IntMonoid extends Monoid[Int] { def plus(x: Int, y: Int): Int = x + y def zero: Double = 0
  24. 24. sum(List(1, 2, 3, 4, 5)) // ⇒ 15 sum(List(1.0, 2.0, 3.0. 4.0, 5.0)) // ⇒ 15.0
  25. 25. 他の型のListもsumしたくなったら?
  26. 26. implicit object BooleanMonoid extends Monoid[Boolean] { def plus(x: Boolean, y: Boolean): Boolean = x | y def zero: Boolean = false } List(true, false, true) // ⇒ true List(false, false, false) // ⇒ true
  27. 27. 話を戻します
  28. 28. めんどくさい def sum[A](list: List[A])( implicit m: Monoid[A]): A = { list.foldLeft(m.zero) { case (total, e) => m.plus(total, e) } }
  29. 29. def sum[A:Monoid](list: List[A]): A = { list.foldLeft(m.zero) { case (total, e) => m.plus(total, e) } }
  30. 30. 型クラスという言葉 出てきましたか?
  31. 31. Monoid[A] みたいなのをScalaで 型クラスと呼んでいるだけ 厳密には説明の順番が逆だけどそこは気にしない
  32. 32. Haskellの型クラスも 原理は同じ
  33. 33. Scalaでは 少し中身が見えている
  34. 34. むしろわかりやすい
  35. 35. 詳しく知りたい人向けの参考文献 Martin Odersky, Poor Man's Type Classes, 2006 http://lampwww.epfl.ch/~odersky/talks/wg2.8boston06.pdf
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×