본문 바로가기

프로그래밍/Scala

PART 1 - Currying (0926)

currying이란

-> 커링을 이용하면 parameter 가 여러 개인 함수를 parameter의 개수가 더 적거나 같은 새로운 함수로 만들 수 있다. 커링을 사용할 때 주의할 점은 첫 번째 파라미터가 아니라면 _에 타입을 명시해야된다는 것이다. 이는 타입추론이 되지 않기 때문이다. 

 

def plus(i:Int)(j:Int):Int = i+j

val plusFive:(Int)=>Int = plus(5)(_)
//Plust함수의 첫번째 파라미터가 5로 고정되어있는 새로운 함수를 선언한 것

println(plusFive(10))
//15

 

 

 

 

 

def sum(f:Int=>Int, a:Int, b:Int):Int =
	if(a<=b) f(a)+sum(f,a+1,b) else 0
 
def sumLinear(a:Int, b:Int) = sum((n)=>n,a,b)
def sumSquare(a:Int,b:Int) = sum((n)=>n*n,a,b)
def sumCubes(a:Int,b:Int) = sum((n)=>n*n*n,a,b)

anonymous function으로 이렇게 코드를 추릴 수 있지만 더 간단하게 적고싶다.

def sumLinear = sum(Linear)

def sumSquare = sum(Square)

이런 식으로 !!

근데 이렇게 적으면 코드는 간단해보이지만 sum은 원리 인자를 3개 필요로 하던 함수였는데 갑자기 어떻게 인자가 단 하나로 줄일 수 있을까? 이 과정이 currying이 생기게 된 motiv 이다.

 

 

해결책은 다음과 같다.

def sum(f:Int=>Int):(Int,Int)=>Int = {
	def sumF(a:Int,b:Int):Int =
    	if (a<=b) f(a)+sumF(a+1,b) else 0
    sumF
}

def sumLinear = sum((n)=>n)
def sumSquare = sum((n)=>n*n)
def sumCube = sum((n)=>n*n*n)

 

위의 코드는 sum 함수 정의 안에 작동하는 함수를 숨김으로써 인자를 줄이는 방법이다!!!

대신 sumF에서 int 2개가 필요하니까 sumSquare(3,10) 이런식으로 선언해주어야 한당

그리고 def sum:(Int,Int)=>Int 라서 즉, sum이라는 함수의 output은 함수로 나와야한다. 그래서 def sumLinear = sum((n)=>n)_ 이런식으로 언더바를 붙이게 되면 Int가 나와서 타입에러가 뜨게 되므로 언더바를 붙이면 안된다!!!

 

 

이 피피티 내용을 잘 이해해볼것!!!!!

 

 

 

 

 

 

 

 

 

 

 

 

 

'프로그래밍 > Scala' 카테고리의 다른 글

Structure Type  (0) 2022.10.21
Currying & Closure 완전 이해하기  (0) 2022.10.21
HW 1. Exercise 1-2 보충  (1) 2022.10.02
Tail Recursion 추가 포스팅  (1) 2022.10.02
HW 1. Exercise 3  (0) 2022.10.02