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 |