0. Moggi가 모나드 전부를 계산 개념이라고 부르지 않았다는건 레퍼런스 있음? 정확히는 lambda calculi의 시멘틱으로 쓰이는 카테고리에서의 모나드중에 계산 개념이라고 불리지 않는게 있는지 의심스러움
1. Moggi가 쓴 논문은 effect를 모나드로 해석할 수 있다는 얘기를 하는거고 모나드는 이미 수학적으로 엄밀하게 정의되는 대상이니 독자에게 해설하려는 목적이 아니라면 굳이 모나드를 재정의할 필요는 없음
2. 나랑은 계산개념과 모나드의 관계를 보는 관점이 완전히 다른것 같은데, 내 이해로 모나드는 effect를 가질 수 있는 계산 그 자체이고, 계산개념은 (lambda calculi의 시멘틱 카테고리에서의) 모나드에 이런 관점을 투사한 것임. Moggi 이전의 계산은 완전히 형식적으로 이해되지 못한 모호한 대상이었고 Monad를 사용해 수학적 정의를 내리고 계산개념이라는 이름을 붙임으로써 계산의 범주가 재정의되었다고 생각함.
그러니까 계산개념으로 모나드를 이해하는게 아니라 모나드로 계산개념을 이해하는게 맞음. 우리의 직관이 리스트를 계산이라고 받아들이지 못했다면 그건 우리의 계산개념에 대한 이해가 부족하기 때문이니 우리의 직관을 고쳐야 함. 리스트에도 계산의 관점을 적용한다는 전에는 없던 사고를 할 수 있게 해주니 계산개념이라는 관점이 유용한거임.
논리적으로는 모나드가 먼저 정의되고 계산개념이 뒤따르는거지만, 프로그래머한테는 모나드 같은 추상적 개념이 익숙하지 않으니 계산을 통해 모나드를 이해하려는 것이고. 물론 이렇게 하면 모나드에 대한 피상적인 이해밖에 되지 못하니 그게 전부라고 생각하는건 곤란하지만.
내가 보기엔 Moggi나 Wadler의 설명은 완벽하게 이해 됨. 처음 보는 사람한테 뜬구름 잡는 소리 처럼 들릴 수는 있겠지만 적어도 틀렸거나 무의미한 말은 아님.
3. bind가 수학적으로 join에 비해 덜 깔끔하긴 하지만, 계산개념 관점에서 이해하기에는 join보다 직관적임. join을 이해하려면 m (m a) 부터가 난점이다. m이 중첩되는게 무슨 의미인데? State/IO 모나드의 경우 bind는 계산을 시퀸셜하게 이어준다는 직관적인 설명을 줄 수 있지만, join은 외려 힘듬. 다만 일반적인건 아니고 리스트 같은 경우엔 join이 이해하기 더 쉽다는데에 동의함. 그런데 이 경우 너도 그렇듯이 계산개념의 관점으로는 잘 생각되지 않지. 나는 이 부분에 있어선 그냥 bind, join, kleisli composition을 다 소개해야 한다고 생각함.
4. 모나드에 대한 비유적 설명이 입문자에게 도움이 되는지에 대해서는 나도 회의적임. 결국 모나드를 제대로 이해하는데에 핵심적인건 개별 모나드들에 대한 사례 분석과 수학적 정의를 제대로 파악하는 것이고, 이 두가지가 병행된다면 저런 비유적 설명도 마냥 나쁘진 않다고 생각함. 부정적인 결과는 보통 저 두가지를 제대로 안한 경우고.
사실 추상적인 개념들은 대부분 이런 방식으로 배워야 됨. 근데 복잡하더라도 구체적인 대상들을 다루는건 잘 하는데 이런 추상적인 개념은 어려워 하는 사람들이 꽤 많다. 경험상 프로그래머들도 그럼. 여기서 결국 모나드를 이해하기를 포기하는 사람들이 나옴. 근데 하스켈 커뮤니티 입장에서는 모나드를 이해하지 못한 사람한테도 하스켈은 권유해야 됨. 그럼 그냥 모나드 모른채로 하스켈을 하면 되는데, 다들 그게 잘 안되는것 같다.
댓글 달려다가 길어져서 글로 씀
몰라서 질문하는 건데 Moggi 페이퍼나 여타 functional programming에서 말하는 computation 개념이 Turing machine(혹은 이것과 equivalent한 Lambda calculi나 기타 여러 방법들)에서 말하는 computation 개념이랑 다른 거임? 얘네는 굉장히 formal한 방식으로 정의되는 거라 CS 하던 사람들이면 전혀 여기서 혼동을 겪을 이유가 없다고 생각하는데
전혀 다름. Moggi본인도 자기 글에서 자기가 말하는 computation의 의미를 정확히 설명하지 않긴 했는데 글의 맥락상 그 단어는 내가 해석한 것처럼 그냥 느슨하게 어떤 비 순수성을 가진 유사 함수들을 통칭하는 뜻으로 이해하는 게 맞음.
나도 계산이라고 지칭하면 잘못 이해될까봐 조금 걱정하긴 했는데 원문에 computation이라고 쓰여 있다길래 그냥 계산이라고 함. 여기서 computation은 IO등 effect를 가질 수 있다는 점에 주목해야 됨
고마워 페이퍼 좀 보긴 해야겠다
이건 좀 천천히 읽어보고 대답하겠음요.
우선 1은 왜 나온 얘긴지 모르겠고 (맥락 설명 부탁함) 0과 2에 대한 얘기가 중요한 것 같은데, 우선 0에 대해서 말하자면 부른 적이 없는 걸 어떻게 레퍼런스를 찾나. 오히려 Moggi가 모나드 전부를 계산개념이라고 부른 적이 있다면 그게 레퍼런스가 필요하지. Moggi가 계산을 다른 의미 (내 글에도 씌여 있지만 난 그 단어를 어떤 비 순수성을 가진 함수들을 통칭해서 나타내는 것으로 봤음) 로 썼다는 내 주장에도 레퍼런스는 없긴 함. 만약 양쪽 다 레퍼런스가 없다면 이건 그냥 해석의 문제가 되는데 그건 아닌것 같고 솔직히 이 부분은 내가 잘못 이해했을 가능성이 커 보인다. 님은 레퍼런스가 확실히 있는 것 같은데 그 레퍼런스를 나한테도 보여줬으면 함.
논문 보면 categorical semantics 어쩌고 하는 부분이 있는데 이 부분을 내가 잘못 해석했을 가능성이 있는듯?
그런데 만약 Moggi가 정말로 님 말대로 계산개념을 모나드를 통해 정의한 게 맞다면 난 Wadler가 아니라 Moggi를 비판해야 할 것 같다. "우리의 직관이 리스트를 계산이라고 받아들이지 못했다면 그건 우리의 계산개념에 대한 이해가 부족하기 때문이니 우리의 직관을 고쳐야 함." 이라는 말에는 전혀 동의할 수 없다. Moggi야말로 계산개념이 계산을 직관적으로 나타내지 못한다는 것을 직시하고 그 단어를 바꿨어야 함. 계산이 완전히 형식적으로 이해되지 못한 모호한 대상이었기 때문에 계산개념을 정의했다면서. Optional과 List까지 계산의 범주에 집어넣는 정의가 과연 계산의 형식적 정의로써 타당한가?
수학에서 개념을 확장 적용하는 사례가 드물지 않은 것은 사실임. 지수 연산같은 것도 원래는 지수가 정수일 경우에만 정의되는 개념이었던 걸 연산의 규칙들을 토대로 실수나 복소수 지수에게도 정의되도록 확장한 거니까. 하지만 이 경우는 그거랑 아예 얘기가 다름. 님 말대로라면 그 확장의 토대가 되어야 할 계산의 원본 개념은 형식적인 정의조차 없는데 뭘 토대로 Moggi의 확장된 계산의 개념을 이해하라는 거?
Moggi의 계산개념이 무언가를 토대로 확장된 거라면 그것은 현실의 유용한 모나드, 즉 T A가 계산을 나타내는 용도로 쓰일 수 있는 것들일 수밖에 없음. 그것들에 대한 이해가 Moggi의 확장된 계산개념을 이해하기 위한 기초가 되어야지 반대로 Moggi의 확장된 계산개념을 이해하고 그들을 이해하라는 게 어떻게 가능하겠냐는 얘기임.
단순히 논리적으로 따져봐도 Optional이나 List같은 건 단지 그걸 반환하는 함수나 표현식이 계산을 나타낼 수 있기 때문에 계산을 나타내는 데 유용성을 가질 뿐임. 심지어 Moggi의 논문에서조차 얘들은 계산이 주로 표현식이고 그러한 표현식이 계산을 나타낼 수 있기 때문에 유용성을 가질 수 있었음. 그렇다면 계산개념 역시 T A가 계산을 나타내는 것이 아니라 T A를 반환하는 표현식이 계산을 나타내는 것으로 이해되어야 하는 것 아닌가.
이에 비해 "리스트에도 계산의 관점을 적용한다는 전에는 없던 사고" 는 혼란스럽고 정말로 우리의 사고 범위를 늘려 주는 건지 사고를 극도로 혼란스럽고 불분명하게 만들기만 하는 건지 의심스러움. 그러한 사고가 실제로 유용해지는 경우를 하나라도 제시할 수 있음?
3. 계산개념부터가 거의 이해가 불가능할 정도로 괴상한 개념인 시점에서 그것을 토대로 이해하기에는 bind가 join보다 쉽다는 게 의미가 있나? 애초에 그거 사실이기는 함? IO 모나드에서 join은 의미가 아주 명확함. A를 반환하는 IO 프로시저를 반환하는 IO 프로시저는 당연히 A를 반환하는 IO 프로시저로 볼 수 있지. 심지어 이 논리는 일반화도 가능함. A를 반환하는 계산을 반환하는 계산이 있으면 A를 반환하는 계산을 만들 수 있는 건 당연한 것 아닌가? T A가 계산이든 뭐든 간에 그게 A의 뭐를 나타내는 시점에서 그 뭐가 명확하기만 하면 그걸 두번 겹치는 건 전혀 어려운 일이 아님. 안 명확한 게 문제고 이건 join이든 bind든 똑같이 문제가 됨.
bind, join, kleisli composition을 다 소개해야 한다는 결론에는 동의함. 문제는 뭐를 먼저 소개해야 하냐는 거지. 모나드의 역사적 맥락을 무시하고 비직관적인데다가 어렵기까지 한 kleisli category기반의 정의를 시작점으로 해서 그 개념을 이해할 필요가 과연 있느냐는 거다. 만약 계산개념이 님 말대로 모나드를 통해 거꾸로 정의되어야 하는 개념이면 더더욱 그건 모나드에 대한 설명의 시작점이 되어서는 안 됨. 그렇지 않나?
4. 이건 대부분 나도 동의하는 얘기긴 한데 약간 사소하게 의견이 다른 부분이 있음. 이건 파트 2 나오면 그 이후에 논의해도 될듯.
아무튼 0과 2에 관해서 님이 지적한 내용은 맞아 보이긴 함. 우선 님 답변을 들어본 다음에 (다시 말하지만 나는 계산이 모나드를 통해 역으로 정의되고 있다는 님 주장에 대한 레퍼런스를 요구하고 있음) 수정도 검토해봐야 할듯. 님 말대로 계산개념이 처음부터 그렇게 정의된 게 사실이라면 계산 은유에는 훨씬 더 뿌리깊은 문제가 있는 건데 과연 이걸 어디서부터 지적하고 어떻게 글로 표현해야 할지는 생각해봐야 할 것 같다.
왜 댓글에는 따봉버튼이 없는것이지?
https://gall.dcinside.com/mgallery/board/view/?id=github&no=39799
여기에 답변함.
미안 좀 바빴어서. 읽고 답변 줄게