고차함수
- 함수를 인자로 받거나, 리턴해주는 함수
1. 값으로서 함수
- 함수를 변수에 저장할수 있다.scala> val fun = ceil _ fun: Double => Double = <function1>
ceil은 임의수보다 크거나 같은 수 가장 작은 수를 리턴해주는 함수이다.
기술적으로 _는 ceil 메소드를 함수로 바꾼다.
스칼라에서 메소드는 조작할 수 없고, 오직 함수만 가능.
2. 익명함수
scala> Array(3.14, 1.42, 2.0).map((x:Double)=>3 *x) res5: Array[Double] = Array(9.42, 4.26, 6.0)익명클래스도 그렇고, 이제는 익명이 조금 익숙해지기 시작한다.
함수의 실행순서가 중요해보인다.
3. 함수인자를 받는함수
scala> def mulBy(factor : Double) = (x : Double) => factor * x mulBy: (factor: Double)Double => Double scala> val quintuple = mulBy(5) quintuple: Double => Double = <function1> scala> quintuple(20) res7: Double = 100.0
quintuple 은 mulBy(5)
즉, (x:Double) => 5 * x 를 리턴한다.
mulBy는 어떤 값을 곱하는 함수를 생성한다.
팩토리 같기도하고 클래스 같기도하고.. ㅎ
4. 인자추론
scala> def valueAtOneQuarter(f:(Double) => Double) = f(0.25) valueAtOneQuarter: (f: Double => Double)Double scala> valueAtOneQuarter((x) => 3 * x) res14: Double = 0.75
valueAtOneQuarter 이라는 함수는
double(0.25)을 인자로 받아 double로 리턴해주는 함수를 리턴한다.
그래서 x의 타입을 굳이 명시하지 않아도 추록이 가능하다.
scala> valueAtOneQuarter(3 * _) res15: Double = 0.75이렇게 까지도 가능하다.
5. 유용한 고차함수
scala> (1 to 5).map("*"*_).foreach(println _) * ** *** **** *****
scala> (1 to 9).filter(_ %2 == 0) res21: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8)
scala> (1 to 9).reduceLeft(_ * _) res22: Int = 362880
scala> "Mary had a little lamb".split(" ").sortWith(_.length < _.length) res23: Array[String] = Array(a, had, Mary, lamb, little)
댓글
댓글 쓰기