본문 바로가기

프로그래밍/Scala

Currying & Closure 완전 이해하기 def sum(f:Int=>Int)(a:Int,b:Int)={ def sumF(a:Int,b:Int):Int = if(an) _ sumLinear(1,10) def sumLinear = sum((n)=>n) _ 여기에서 언더바를 사용하지 않으면 에러가 뜨는데, 여기에서 에러가 뜨는 이유는 closure의 문제 보단 sum(f)(a,b) 인자 생략의 문제인 것 같다!!! 어떤 인자가 올 자리라는 것을 표시하는 의미에서 _ 를 붙여야한다. 위의 sum def에서sumF는 언더바를 붙이든 안붙이든 에러가 생기지 않는다. 이는 inference를 해주기 때문이다. def 안에 def 가 있을 때 더보기
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(an,a,b) def sumSquare(a:Int,b:Int) = sum((n)=>n*n,a,b.. 더보기
HW 1. Exercise 1-2 보충 저번에 대충 짜둔게 있긴한데 stackoverflow가 떠서 ^__^;; 반타작만 할 순 없으므로 일단 할 수 있을 때까지 해봄 가 보 자 고 다시 올리는 문제 /** * Exercise 1-2: fold * * Calculate f(a, f(a + 1, f(a + 2, ... f(b - 1, b)))) `(0 Long, a: Long, b: Long): Long = ??? 다시 생각해낸 solution def fold(f: (Long, Long) => Long, a: Long, b: Long): Long = { def putting(a: Long, b: Long, f: (Long, Long) => Long, res: Long = b):Long = { if (a == b) res else { val ne.. 더보기
Tail Recursion 추가 포스팅 Scala는 Functional 스타일을 권장해서 Loop 보다는 Recursion을 더 권장한다. Loop보다 Recursion이 사람의 사고에 더 가깝다고 하고, 모든 Loop는 재귀로 표현할 수 있다고 한다. 처음에 교수님께서 과제 조건으로 for문이나 while문을 사용하지 말라고 하셔서 잘 이해가 안갔는데 이제야 이해가 된다.   아래 내용은 Scala By example의 4.6 Tail Recursion 부분에 나온 예제이다. def gcd(a:Int, b:Int):Int = if (b==0) a else gcd(b,a%b) 한줄로 끝나서 조금 허무하지만 엄청난 코드이다. 최대공약수를 구하는 코드를 tail recursion으로 작성한 것이다. 나 역시 그냥 recursion이랑 tail r.. 더보기
HW 1. Exercise 3 10월 첫째 날 기념으로 상콤하게 과제 가보자고 마지막 문제 /** * Exercise 3: Termination checker * * Find the first integer `n` which makes `pred(f^n(init))` True. * * For example, if pred(init), pred(f(init)), and pred(f(f(init))) is all False, * and pred(f(f(f(init)))) gives the first True value, then return 3. * If pred(init) is True, return 0. * * f: repeating function * pred: Termination predicate. If p(n) returns .. 더보기
Recursion / Tail Recursion tail recursion은 어제 수업(9/29)에서도 잠깐 나왔다. 자칫하면 StackOverFlow Error가 뜰 수 있으므로 stack을 아끼기 위해서 일부로 코드를 돌아돌아서 쓰는게 Tail Recursion이다 A4용지에 간단히 정리를 해보았는데 사진을 첨부하겠다 코드가 마냥 간결하다고 좋은게 아니라 내가 짠 코드가 어떻게 돌아가는지 알고 더 효율적으로 짤 수 있는 방법이 있는지가 중요하다 ㄹㅎ 더보기
HW1. Exercise 2 def factorial(n:Int, res:Int = 1):Int = { if(n==0) res*1 else factorial(n-1, res*n) } 이어서 세번째 문제이지만 두번째 문제 /** * Exercise 2: Binomial Coefficient * * Calculate the binomial coefficient with n and k, i.e. nCk (0 더보기
PART 1 - Blocks and Name Scoping (1) 5차시(9.15)에 해당하는 내용 .... 까마득하다 .... 2주전이네 .... 오늘 수업 들어가기 전에 A4 용지에 간단히 복습했다. 뿌듯하니까 복습한 사진 첨부 block을 쓰기 시작하면 local variable / global variable 의 의미가 중요해진다. 그리고 혼동하기 쉬운데 이를 잘 보여주는 코드가 있다 val t=0 def f(x:Int) = t + g(x+1) def g(y:Int) = y*y val x = f(5) //cbv니까 바로 x=36 저장 val s = { val t = 10 f(5)} 위의 코드에서 x와 s는 모두 f(5)인데 쓰인 블럭이 다르고 블럭에서의 t값이 다르다. Q. x와 s는 같을까 ? 정답은 같다. 이는 name의 정의와 관련된 개념인데 f가 정의될 .. 더보기