하스켈 기초만 떼고 파이썬에 패러다임을 접목 시켜보려고 하는데
예를들어
빈 리스트 a=[] 에 b=[1,2,3]의 원소들을 옮겨 담고 싶을 때,
일반적인 방법으로는
for i in range(len(b)):
a.append(b[i])
가 있는데
이렇게 하면 a라는 변수가 갖는 값이
같은 스코프 내에서 유동적으로 변하는 부작용이 발생하기 때문에
def func(_list,i,_list2):
if i<len(_list):
_list2.append(_list[i])
return func(_list,i+1,_list2)
else:
return _list2
위와 같이 재귀적으로 함수를 정의한 후
a=func(b,0,[])
이렇게 a를 선언해 주면
특정 변수가 재정의 되는 경우 없이 깔끔하게 선언이 완료 되므로
(재귀되어 파생적으로 실행되는 각각 함수에서의
_list2.append() 는 상위함수에서 인자만 받았을 뿐이지
변수 자체는 각각 다른 별개의 변수이기 때문에)
'부작용' 을 최소화 할 수 있다..
이게 맞나요?? 아니면 저 혼자 뇌피셜로 개삽질 하는 건가요??
가르침 좀 부탁드립니다...
예를들어
빈 리스트 a=[] 에 b=[1,2,3]의 원소들을 옮겨 담고 싶을 때,
일반적인 방법으로는
for i in range(len(b)):
a.append(b[i])
가 있는데
이렇게 하면 a라는 변수가 갖는 값이
같은 스코프 내에서 유동적으로 변하는 부작용이 발생하기 때문에
def func(_list,i,_list2):
if i<len(_list):
_list2.append(_list[i])
return func(_list,i+1,_list2)
else:
return _list2
위와 같이 재귀적으로 함수를 정의한 후
a=func(b,0,[])
이렇게 a를 선언해 주면
특정 변수가 재정의 되는 경우 없이 깔끔하게 선언이 완료 되므로
(재귀되어 파생적으로 실행되는 각각 함수에서의
_list2.append() 는 상위함수에서 인자만 받았을 뿐이지
변수 자체는 각각 다른 별개의 변수이기 때문에)
'부작용' 을 최소화 할 수 있다..
이게 맞나요?? 아니면 저 혼자 뇌피셜로 개삽질 하는 건가요??
가르침 좀 부탁드립니다...
ㄴㄴ 함수형의 핵심철학은 immutability, 즉 한번 정해진 값은 그 자체로 영원(하지만 시간에 따라 사라진다). 그래서 값을 바꾸는 일은 허용하지 않는다는 점
외부에 있는걸 바꾸면 안됨
ㄴ 그럼 위의 코드에서는 어떤점이 그런 법칙에 위배되는 건 가요?
들어온거에 append했는데 리턴없는거보니 저기서 사이드이펙트 이용한걸텐데 그게 지역변수가 아니면 참조무결성이 깨짐
음..그럼 저건 어떻게 코드를 짜야 진정으로 함수형에 부합할수 있나요?
append가 원래 데이터를 파괴하지않고 새 데이터를 반환하는게 가장 단순핫 방법이고
리턴은 다 있어요 어팬드 한걸 다시 다음 함수에 인자로 넣어서 돌리는 건데...아하 어팬드 자체를 배제하고 한번 다시 고민해봐야겠군요!
함수형 언어를 사용하라. 함수형은 가비지 콜렉터 성능이 특히 중요
ㅇㅇ 로컬변수에 대한 변경은 사실 스까지향이라 혼모노 함수언어 한번 해보시는게 나을듯
으... 함슬람냄새
함슬람의 길은 어렵내요.. immutability가 진정으로 무엇인지 다시 한 번 진지하게 고민해봐야겠어요..