More Related Content
More from Kota Mizushima (20)
こわくない型クラス
- 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)
}
}
- 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. 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)
- 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. 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
- 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
- 28. めんどくさい
def
sum[A](list:
List[A])(
implicit
m:
Monoid[A]):
A
=
{
list.foldLeft(m.zero)
{
case
(total,
e)
=>
m.plus(total,
e)
}
}
- 35. 詳しく知りたい人向けの参考文献
Martin
Odersky,
Poor
Man's
Type
Classes,
2006
http://lampwww.epfl.ch/~odersky/talks/wg2.8boston06.pdf