두개의 데이터를 스왑해야하는 예시.
a와 b의 값을 바꿀때 보통 어떻게 바꿀까요?
let t = a
a = b
b = a
가 정석이라고 생각합니다.
좀 똑똑한 친구들은
a = a ^ b
b = a ^ b
a = a ^ b
를 떠올리기도 합니다.
여기서, 함수형은 데이터를 어떻게 스왑할까요?
위 맥락에서는 이 질문 자체가 성립하질 않습니다.
두개의 값을 서로의 값으로 변경하는데, 함수형이라뇨... 주어진 질문 자체가 함수형스럽지 않은데 이걸 함수형으로 처리하라니 질문자체가 이상해보입니다.
하지만, 이 답변을 들으면 "아! 이게 함수형이구나!!" 싶을만 한데요,
바로
\(a, b) -> (b, a) 입니다.
이 얘기를 들으면 반응이 두가지일거라고 생각하는데요.
첫째는 "이렇게 단순한걸 왜 고민하고 있었지? 충격이다" 랑
둘째는 "이건 아예 다른거잖아. 이건 스왑이 아니야" 라는 반응일거 같습니다.
근데 대충 제가 하고싶은 말은,
레지스터들의 상태를 변경해가며 연산하는 절차지향과
인풋으로 데이터를 쏘고, 아웃풋으로 데이터를 내뱉는, 즉 데이터를 스트리밍 하는 함수형과
상황을 바라보는 관점 자체가 다르다는 것을 표현하고 싶었습니다.
C#에서도 (a, b) = (b, a) 식의 스왑이 되는데요...
(a, b) = (b, a) 같은 구문은 함수형이랑 아무 상관 없는 기법임.
그 방식으로 코드를 짜고 싶으면 함수형을 공부하면 되죠. 절차지향은 내부에 상태를 두면서 계산하는게 아무래도 더 익숙한거고, 함수형은 내부에 상태가 없는게 더 익숙한거고
제가 무슨 말을 했는지 이해 못하심? (a, b) = (b, a)가 C#에서도 되는게 C#이 함수형을 받아들여서가 아님. C#에서 해당 구문은 tuple deconstruct를 이용한거지 함수형이랑 전혀 상관 없다니깐? 글의 메인 소재가 전제부터 잘못됐는데 거기서 쌓은 논리가 대체 무슨 의미가 있겠음...
Python a, b = b, a 의문의 1승 적립
얜 러스트 빨때부터 실력은 없으면서 지적허영심만 가득찬게 변한게 없노
작동하는 제품을 만드십시오 딱국씨
랭귀지이론 전공하는 대학원생이나 교수임? 왜이렇게 함수형에 집착함?
안그래도 대학원 갈까 생각중이긴 함. 너무 재밌어서
화이팅 유학가세요
지식공유자로서의 책임도 좀 필요하신 부분 아닐지
얼마전까지 쓰던 글은 괜찮았는데, 갑자기 산으로 가버린 느낌
흠.... 이 글이 근데 위험한 글이라고 생각되지는 않는데.... (a, b) -> (b, a) 이거 작지만 생각보다 쏠쏠해요... 흠... 별로 안 신기한가요? 스왑하는 방법으로 공간을 뒤바꿀게 아니라 아예 새로운 리턴값으로 반환해버리는거
위험한게 아니라 논리가 틀렸다는건데 쓰는 댓글조차도 산으로 가네
게이야 저능하면 자각이라도 있어야하지 않겠노
애초에 xor 스왑이 똑똑함? 그게 훨씬 느린데 그냥 겉멋충용이지
xor 스왑은 존나 멍청한 짓임 언어 수준에서 그러고 있으면 컴파일러가 변수 리네이밍으로 swap 다음엔 a랑 b 이름만 바꿔서 실제로 t변수 선언하고 할당하는 부분을 실행하지 않음 xor쓰면 컴파일러가 최적화하기 더 까다로워짐 어셈 수준에서도 멍청한 짓인게 xchg 명령어 하나만 쓰면 됨 최적화 한다면서 xor 명령어 3개로 더 느려지게 만드는거임
? - dc App
딱국이가 ADHD의 전형적인 표본인듯 글은 뭐라도 깨달은것마냥 쳐쓰면서 정작 맞는말은 단하나도 없노 ㅋㅋㅋ
값 똑같으면 멍텅구리되는 xor스왑이 뭐가 똑똑하냐....
xor스왑을 똑똑하다고 표현한거에 반대의견이 많은거같은데 솔직히 말하면 xor스왑은 묘수풀이 그 이상도 그 이하도 관심 없지만 묘수풀이로서의 의미는 있다고 생각하고, (a, b) -> (b, a) 도 t사이에 두고 스왑하는것보다 더 좋아서 함수형이라고 표현한게 아님. 더 좋을게 뭐있음. 스타일차이인데. t를 두고 스왑하는거는 함수 내부의 로컬변수의 상태를 변경하는거고, (a, b) -> (b, a) 는 함수 외부가 함수를 투과하고 지나가면서 변형되는거고. 그냥 스타일 차이일 뿐임. 그냥 "함수형은 뭐가 다른데?" 를 표현하고 싶었음. 흔히말하는 상태 변경하지 말아라, stream 쓰면 함수형이다, 맵 필터 리듀스 쓰면 함수형이다, 함수를 인자로 건네주면 함수형이다. 이런얘기 많잖음.
난 뭔가 근본적인?? 발상의 전환 같은거?? 그냥 "이건 함수형 테크닉이라고 합니다. 저쪽에서 가져왔어요" 말고 진짜 그 뭔가가 세상이 달라보이는 무언가를 전달해주고싶었는데, 값 두개를 변형한다는 생각을, "이미 있는 값을 변경"하는게 아니라, "새로운 값으로 재창조해서 내뱉는" 그런거 좀 발상의 전환이라고 여겼는데 아닌가...
그리고 이 무상태성에 내가 좀 과하게 집착하는데 (나한텐 무상태성이 일단 효용을 떠나서 너무 재밌음. 뭔가 스타일리시하고 깔끔함) 저번 댓글말대로, 상태를 안에서 쓰더라도 그 안에서만 쓰고 캡슐화하면 그게 순수함수 아니냐 하면 맞는말이거든 실제로 하스켈로도 순수함수로 내부에 상태써서 표현 가능함. 모나드로 코드가 더럽혀질 뿐, 가능 함. 그 말이 모나드 벗겨내고 자체적으로 프로그래머가 순수성을 보장해줘도 상관없단말임. 무상태성은 함수형을 표현하는 단어가 아닌거같음. 순수함수형을 표현하는 단어일수는 있어도. 그래서 무상태성에 별로 관심 없으면 그냥 뭐 의미없는 말임. 근데 무상태 코딩 이거 진짜 굉장히 재밌는데....
함수형은 매번 새로운 데이터를 창조해냄. map을 예시로 들면, 리스트안에있는 내용물을 변경하는게 아니라 리스트를 재창조한다던지. 변경을 사실상 재창조로 치환해서 생각하는데, 이게 좀 재밌음. 솔직히 함수형이 그렇게까지 쓸모있다? 이건 꼭 도입해야한다? 는 잘 모르겠는데 일단 재밌고, 발상의 전환같은 새로운 시각이 생긴다는 점에서 마음에 들음
그냥 신태틱 슈거같은거 아닌가요? 이건 어셈블리를 까보면 결국 다 똑같이 동작하지 않을까 싶은데..
맞죠. 사실 상태를 안쓴다는 말도 웃긴말인게, 함수형이 아무리 모든 입력을 argument에 넣고, 모든 출력을 output으로 받는다고 해봤자, 그 argument와 return값 전부다 컴퓨터 안의 레지스터를 사용하죠. 그리고 함수형이 계산하는것도 아무리 무상태로 짠다고 한들, 내부에는 다 heap 영역에 데이터 배정되어서 사용됩니다. 그냥 말장난이긴 한데, 애초에 철학이라는게 일종의 말장난 아닐까요? 관점의 차이?
님만 아는거 아님 그만 나대요