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이다.
'학교 공부 > 프로그래밍원리' 카테고리의 다른 글
PART 2 - Object-Oriented Programming (1) (0) | 2022.10.23 |
---|---|
PART 1 - Exception & Handling , DataType (0929) (0) | 2022.10.20 |
HW2 - Exercise 2 (0) | 2022.10.19 |
PART 1 - Functional Programming with Function Applications (2) (0) | 2022.09.29 |
PART 1 - Functional Programming with Function Applications (1) (1) | 2022.09.29 |