ここで言う多相は継承等による多相*1ではなく、型変数を利用した(総称)多相関数*2。
この辺りは特に目新しいことは無かった。
データ型(List)
List[+A]として変位を共変にしてNil extends List[Nothing]とすることでval l: List[Int] = Nilみたいにできる。
演習問題
def isSorted[A](array: Array[A], p: (A, A) => Boolean): Boolean = {
@annotation.tailrec
def loop(n: Int): Boolean = {
val next = n + 1
if(array.length <= next){
true
}else if( p(array(n), array(next)) == false ){
false
}else{
loop(n+1)
}
}
loop(0)
}
def curry[A, B, C](f: (A, B) => C): A => (B => C) = a => b => f(a, b)
def uncurry[A, B, C](f: A => B => C): (A, B) => C = (a, b) => f(a)(b)
def compose[A, B, C](f: B => C, g: A => B): A => C = a => f(g(a))