recursion부분 탐색..
{with {fac {fun {n}
{if0 n
1
{* n {fac {- n 1}}}}}}
{fac 10}}
위처럼 하면,, fac가 free identifier가 되어버림..
{with {facX {fun {facY n}
{if0 n
1
{* n {facY facY {- n 1}}}}}}
{facX facX 10}}
이렇게 하면 해결 가능.. 그런데 우리가 사용하는 scala에서는 only single-argument function만 갖고 있어.
{with {fac
{fun {n}
{with {facX
{fun {facY n}
{if0 n
1
{* n {facY facY {- n 1}}}}}}
{facX facX n}}}}
{fac 10}}
그래서 이렇게 만들었다!
여러 매개변수를 가진 함수를 다룰 때 함수형 프로그래밍의 중요한 기법인 커링(currying)을 보여줌. 커링은 여러 개의 인수를 갖는 함수를 하나의 인수만을 받는 함수로 변환하는 과정!
{with {fac
{fun {n}
{with {facX
{fun {facY}
{fun {n}
{if0 n
1
{* n {{facY facY} {- n 1}}}}}}}
{{facX facX} n}}}}
{fac 10}}
이전 코드를 위의 코드로 다시 한번 커링을 함.
η reduction
같은 결과가 나오면, 같은 함수이다!
fun {n} {~~~ ,n}}} ::> 커링..!
{with {fac
{with {facX
{fun {facY}
{fun {n}
{if0 n
1
//Make this to be substituted by fac.
{* n {{facY facY} {- n 1}}}}}}}
{facX facX}}}
{fac 10}}
위의 것을 한번 더 update..
{with {fac
{with {facX
{fun {facY}
{with {fac {facY facY}}
{fun {n}
{if0 n
1
{* n {fac {- n 1}}}}}}}}
{facX facX}}}
{fac 10}}
여기에서도 fac는 multiple parameter를 갖고 있으니..
{with {fac
{with {facX
{fun {facY}
{with {fac {fun {x} {{facY facY} x}}}
{fun {n}
{if0 n
1
{* n {fac {- n 1}}}}}}}}
{facX facX}}}
{fac 10}}
이번에 배운 개념을 fibonacci와 sum과 같은 것에도 적용해보기!