Java
Scala
C++ swap
Scala length sum
length
length
def length(list: List[Double]): Double =
list match {
case Nil => 0
case _ :: tail => 1 + length(tail)
}
val list = List(1.0, 3.14, 2.71)
length(list) // 3
val list = List(42, 99, 666)
length
error: type mismatch;
found : List[Int]
required: List[Double]
length(list)
List[Double] List[Int]
length
List[Double] => Double
length
Double Int
String Any
def length[A](list: List[A]): Double =
list match {
case Nil => 0
case _ :: tail => 1 + length(tail)
}
length
[A]
1
new
def func[A, B, C](arga: A, argb: B): C = ...
length
length
[A]
length
length
val listDouble = List(1.0, 3.14, 2.71)
length[Double](listDouble) // 3
val listInt = List(1, 2, 3, 4, 5)
length[Int](listInt) // 5
val listString = List("hoge", "fuga", "piyo")
length[String](listString) // 3
Scala
val listDouble = List(1.0, 3.14, 2.71)
length(listDouble) // 3
val listInt = List(1, 2, 3, 4, 5)
length(listInt) // 5
length
length
def length[A](list: List[A]): Double =
list match {
case Nil => 0
case _ :: tail => 1 + length(tail)
}
A A
2
2
def twoList[A, B, C](list1: List[A], list2: List[B], func: List[?
(func(list1), func(list2))
3
List[A] List[B]
length
def length(list: List[_]): Double =
list match {
case Nil => 0
case _ :: tail => 1 + length(tail)
}
length
List [_]
A
A
def func(list: List[_ <: AnyVal]) = ...
A <: B A B
twoList(List(1,2,3,4,5), List("hoge","fuga","piyo"), length) // (
8-1
sum
sum
def sum(list: List[Double]): Double =
list match {
case Nil => 0
case head :: tail => head + sum(tail)
}
Double List
val list = List(1.0, 3.14, 2.71)
sum(list) // 6.85
List(42, 99, 666)
val list = List(42, 99, 666)
sum(list)
// error: type mismatch;
// found : List[Int]
// required: List[Double]
// sum(list)
length
Double
Int
length
sum Int Double
def sum[A](list: List[A]): A =
list match {
case Nil => 0
case head :: tail => head + sum(tail)
}
……
type mismatch;
found : Int(0)
required: A
case Nil => 0
^
type mismatch;
found : List[A]
required: List[String]
case head :: tail => head + sum(tail)
^
sum Scala
def sum[A](list: List[A]): A =
A A
A
case Nil => 0
A
Int
Scala
case head :: tail => head + sum(tail)
+
A +
sum
sum
2
0
2
<:
trait Addable {
def +(other: Addable): Addable
}
def add[T <: Addable](a: T, b: T) = a + b
T +
+
Addable
Scala Int
Double
Scala
Numeric
Haskell
Scala
implicit
Scala
def sum[A](list: List[A])(implicit ev: Numeric[A]): A =
2 implicit
[A]
A
ev evidence
Ruby
Numeric
trait Numeric[T] extends Ordering[T] {
def plus(x: T, y: T): T
def minus(x: T, y: T): T
def times(x: T, y: T): T
def negate(x: T): T
def fromInt(x: Int): T
def toInt(x: T): Int
def toLong(x: T): Long
def toFloat(x: T): Float
def toDouble(x: T): Double
def zero = fromInt(0)
def one = fromInt(1)
def abs(x: T): T = if (lt(x, zero)) negate(x) else x
sum
0
plus zero
Numeric
sum Numeric
Scala
Numeric
Numeric
def sum[A](list: List[A])(implicit ev: Numeric[A]): A =
list match {
case Nil => ev.zero
case head :: tail => ev.plus(head, sum(tail))
}
sum
ev
ev
val listDouble = List(1.0, 3.14, 2.71)
sum(listDouble) // 6.85
val listInt = List(1, 2, 3, 4, 5)
sum(listInt) // 15
sum
9-1
9-2
sum
def sum[A: Numeric](list: List[A]): A =
list match {
case Nil => implicitly[Numeric[A]].zero
case head :: tail => implicitly[Numeric[A]].plus(head, sum(ta
}
[A: Numeric]
context bound
implicitly
def implicitly[T](implicit e: T) = e
9-3
Scala

学生向けScalaハンズオンテキスト part2