본문 바로가기

학교 공부/프로그래밍원리

PART 1 - Higher Order Functions (0922)

type을 사용하려면

1) value 표시 (introduction)

2) 연산 (elimination) : type 값으로 뭘 할 수 있는지

 

Higher Order Functions은 코드의 재사용성과 가독성을 높임

 

Higher Order Function의 예시는 

 

def sum(f:Int=>Int, n:Int):Int =
  if (n<=0) 0 else f(n) + sum(f,n-1)
   

def linear(n:Int) = n
def square(n:Int) = n*n
def cube(n:Int) = n*n*n

def sumLinear(n:Int) = sum(linear,n)
def sumSquare(n:Int) = sum(square,n)
def sumCube(n:Int) = sum(cube,n)

 

이렇게 반복되는 패턴이 보이면 하나의 함수로 묶어버리는 것이 하이어 오더 펑션이다.

 

 

 

또 중요한 개념인 Anonymous function이 나온다

익명함수 이름 그대로 함수에 이름을 붙이지 않고 사용하는 함수이다.

 

def sumLinear(n:Int) = sum(linear,n)

def sumLinear(n:Int) = sum((x:Int)=>x,n)
def sumSquare(n:Int) = sum((x:Int)=>x*x,n)
def sumCube(n:Int) = sum((x:Int)=>x*x*x,n)

 

 

이거는 소름돋는 예제

 

 

 

 

 

 

 

 

 

다음은 closure에 대해서 배웠다. 

교수님 피셜 closure은 코드와 그 코드가 정의됐을 때의 환경을 페어링 해주는 도구라고 하셨다. 일종의 여권? 느낌!! closure가 사용된 예시 코드를 살펴보자.

 

val t = 0
val f:Int => Int = {
	val t = 10
    def g(x:Int):Int = x+t
    g _}
f(20)

이 코드에서는 f가 곧 g의 값을 받는데 f(20)이 소환된건 g가 정의된 블럭의 밖이다. 따라서 이런 경우를 대비해서 g 옆에 _를 붙여주고 여기가 내가 정의된 환경이야 !!!를 알려주는 것이다. 가끔은 closure inference로 error가 안뜨지만 가끔은 error가 뜨니까 그냥 평소에 closure를 붙이는 습관을 들이자. 

 

위의 코드를 실행하면 30 이 나온다. t = 10 을 사용했기 때문이다.

위의 코드를 조금만 더 분석해보면 f를 val로 정의했으므로 value를 return 해야만 다음 코드로 넘어간다. 따라서 꼭 !!!!! value를 return 해줘야돼서 val f = g 라고 하면 안된다. val f = g _ 라고 해야 실행이 정상적으로 된다. 

 

 

 

마지막 페이지다!!

 

 

이 슬라이드의 요지는 def로 정의된 함수는 value가 아니고 parameterized expression이라고 하는 것이다.  parameterized expression이 value로 converted 되려면 f _ 이렇게 해주면 된다. f _는 더이상 expression이 아니고 value이다. 

 

우리가 위에서 잠깐 봤었던 anonymous functions 또한 value이다.