가끔 하스켈, 함수형 글이 나오면 호기심을 가지고 눌러보는 게 내 눈팅 속성임. 그러면서 겉핥기한 지식으로 공상에 빠지곤 함.
하스켈 가독성이 안 좋은 이유를 누가 올렸는데 어느 정도 맞아 보이지만 난 그게 전부라는 생각이 안 들었음. 그걸 아는 사람들이 왜 하스켈 코딩만 하면 그 지경이 되는가를 설명하지 않았기 때문임.
OOP 프로그래밍의 핵심은 this라고 생각함. 이 암시 문맥 덕분에 코드 작성 단축과 자동완성의 편의를 누릴 수 있음. 재사용 단위가 객체 단위로 커지는 트레이드가 있지만 트레이드로 보지도 않을 만큼 널리 받아들인 방식이지.
이게 하스켈로 넘어오면, 암시 문맥을 온전히 표현하는 문제라고 하면 모나드를 반환하는 함수를 짜야함. 실제로 모나드 하나만 사용하는 하스켈 코드는 꽤 깔끔해 보이기도 함.
하지만 현실에서 암시적 문맥은 중첩되기 마련이고 여기서 하스켈 이펙트 시스템은 GG를 침. 위의 파싱코드에서 로깅을 넣고 싶다? 난이도가 갑자기 산으로 감.
그리고 현실은 모나드조차 잘 쓰지 않음. 모나드 자체도 상당히 복잡한 기능이라 재사용성을 낮춘다는 생각임. 이 결과로 나온 코드가 총체적 난국인 거임. 인자는 전부 써줘야하고 필요한 데이터 있으면 최상위부터 접근해서 빼와야 하고…
내가 예전에 썼던 글을 재탕하는 느낌도 들지만 결국 하스켈은 도전적인 언어고 일부 고인물들이 이펙트 시스템 쪽을 계속 연구하고 있다고 보면 됨. 리액트 훅도 algebraic effect의 아이디어를 빼와서 사용했지만 이것저것 삐걱거리는 이유가 하스켈이 해결하지 못한 문제에서 샛길을 선택한 결과라고 생각함.
최근 본 것 중에 함수형을 얘기하면서 자연스럽게 하스켈을 예시로 들고 속 빈 강정 아니냐는 논지도 있던데 난 하스켈을 배우면서 얻은 게 있다고 확신함. 순수, 비순수 코드를 나누는 이유를 깨달은 거임. 난 이게 함수형에서 얻을 수 있는 교훈이라고 생각하고 있음.
근데 함수형 = 하스켈이란 생각을 가지고 함수형은 쓸모없다라는 생각을 하면 rescript나 다른 언어들이 아쉬울 것 같음.
로깅이 뭐에요?
putStrLn
저도 그런 문제에 많이 봉착했었는데, 해법은 뭔가를 하려고 할 때마다 새로운 타입을 만드는 거였어요. 예를 들어서, 파싱하면서 출력하는 게 아니라, 파싱 먼저해서 구문트리를 뽑고 그 다음에 구문트리를 해석해서 아웃풋을 작성하고, 아웃풋을 출력하는 거에요.
물론 저는 초보라서 저 방법이 안 통할 정도의 복잡한 상황은 겪어보질 않았어요
아무튼 작업을 할 때마다 그 작업에서 다루는 사물을 정확하게 타입으로 표현하면 된다고 생각해요, 저는.
예를 들어서, 오직 TermNode를 출력하기 위해서 ViewNode라는 자료형을 정의했어요:
https://github.com/KiJeong-Lim/portfolio/blob/main/src/Aladdin/Back/Base/TermNode/Show.hs#L23
사실 그게 하스켈 친화적인 방식이고 바람직한데 그걸 강제하면 실제론 원하는 대로 코드를 배치할 수 없다는 한계와도 같다고 봐요. 한 코드 조각에서 로깅과 파싱을 전부 다루느냐, 멀리 떨어진 코드에서 각각 다루느냐는 가독성 측면에서 다른 코드라고 생각해요. 물론 하스켈은 두 방식 모두 가능하지만 그 변경 비용 때문에 해도 되나하는 생각이 먼저 들죠. 새로운 타입을 만드는 것도… 나쁘다곤 볼 수 없는데 제 경우엔 번거롭게 굳이 만들어야 하나 하는 생각이 들더라고요. 아마 다른 사람들도 같은 생각을 해볼 것 같아요. 새로 나오는 이펙트 시스템들도 새로운 타입을 반드시 만들게 하진 않는 것 같고요.
위에서 새로운 타입이란 건 섞인 이펙트를 표현하는 타입을 말하는 거였어요. 여긴 저한테 더욱 겉핥기의 영역이라 제대로 설명하기 힘드네요.
"새로 나오는 이펙트 시스템들도 새로운 타입을 반드시 만들게 하진 않는 것 같고요." 혹시 예를 들어서 설명해주실 수 있나요? 제가 댕청해서 이해가 안 되네요 ㅠㅠ
http://dev.stephendiehl.com/hask/#cb346
example2의 타입은 바뀌기 쉽고 굳이 정의하기가 애매할 수 있는 타입이에요. naming things 문제를 굳이 들여올 필요가 없다고 생각하는 거죠.
안전한 이펙트 혼합은 바랐지만 그게 구체적으로 뭐고 어떤 이름을 가져야하는지는 신경쓰고 싶지 않을 수 있다는 말이었어요.
아, 제가 가보지도 못한 세계가 있었네요 .... 어쩐지 이해가 안 되더라니. 알려주셔서 감사합니다.
동적 타입 쓰고 편안해집시다. 어서 갓-바와 근로저를 인스톨하십시오
그럴 바에야 rescript 쓰고… JVM 이제 놔드려야죠
그건 또 무슨.. 처음 들어보는 언어네효 갓바스크립트를 대체하고 싶다면 Clojurescript를 쓰시면 되는 부분이구요
특히 최근에 많이 공감이 되는 중.. 로깅이고 뭐고 이펙트 들어간 것들 모든 설계를 끝내고 나서 코드로 짜는건 괜찮은데 그게 진정 개발에 이득이 되는가는 생각해봐야 하는 문제인듯