프로그래밍/Scala

함수적 자료구조 단방향 연결 리스트

모지사바하 2015. 8. 10. 17:50

package kwo2002.scala

/**
* Created by kwo2002 on 2015-08-04.
*/
sealed trait List[+A]

case object Nil extends List[Nothing]

case class Cons[+A](head: A, tail: List[A]) extends List[A]

object List {
def sum(ints: List[Int]): Int = ints match {
case Nil => 0
case Cons(x, xs) => x + sum(xs)
}

def product(ds: List[Double]): Double = ds match {

case Nil => 1.0

case Cons(x, xs) => x * product(xs)

}


def apply[A](as: A*): List[A] = {
if (as.isEmpty) {
Nil
} else {
Cons(as.head, apply(as.tail: _*))
}
}


}

회고.

스칼라의 가변 인수 함수 apply 가 특이했음.


apply 는 관례처럼 선언되며 List(1, 2, 3, 4, 5) 나 List("hi", "bye") 처럼 임의의 개수의 인수들을 쉼표로 구분한 구문(목록리터럴, 리터럴 이라고 부르기도 함) 으로 함수를 호출 할 수 있음.. 자바의 생성자 호출하는거랑 같은 형태..


자바에서는 직관적이지 않고 헷갈렸던 재귀호출이 스칼라에선 왜이렇게 자연스럽고 이해하기 편할까 ...?? 분명 같은 재귀인데 ..