[Scala] 고차 함수

smlee·2023년 10월 24일
0
post-thumbnail
  • 이 글은 Manning Functional Programming in Scala의 Chapter2.4를 보고 작성한 글입니다.

고차 함수(High-Order Functions)란 함수 내의 인자로 함수로 받으며, 리턴값으로 함수를 리턴할 수 있는 것을 고차함수라고 한다. 즉, 함수형 프로그래밍에서 함수는 value로 취급될 수 있는 것이다.

함수는 변수에 할당될 수도 있고, Data structure에 보관될 수 있고, 함수의 인자로도 전달 가능하다. 순수 함수로 프로그램을 작성하기 위해서는 함수가 다른 함수의 인자로 넘겨지는 것은 매우 흔한 일이다.


다음과 같은 factorial 함수가 있다고 생각해보자.

def factorial(n: Int): Int = {
	def go(n: Int, acc:Int): Int =
    	if(n <= 0) acc
        else go(n-1, n*acc)
        
    go(n, 1)
}

이와 같이 factorial은 꼬리재귀를 사용하여 정수n에 대하여 Int 범위 내에서 n의 팩토리얼 값을 리턴해주는 함수이다. (함수형 프로그래밍을 짜려면 변수의 변화가 없어야 한다. 따라서 꼬리 재귀를 사용한다.)

위의 factorial 함수의 결과값을 정해진 포맷의 문자열로 변환시켜주는 고차함수를 작성하면 어떻게 될까?

def formatResult(description:String, n: Int, f: Int => Int): String = {
	val msg = "The %s of %d is %d."
    
    msg.format(description, n, f(n))
}

formatResult("factorial", 7, factorial)

위와 같이 formatResult의 마지막 인자의 자료형을 보면 Int => Int이다. 즉, Int형 1개를 인자로 받고 Int형의 결과값을 리턴하는 함수를 인자로 받는다는 뜻이다. 따라서, formatResult는 고차함수가 된다.

0개의 댓글