PLT_5

bells!·2024년 11월 4일

PLT

목록 보기
5/7

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과 같은 것에도 적용해보기!

profile
bell!

0개의 댓글