문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 Haskell (문단 편집) == 수학과의 관련성 == 위의 내용을 읽어 보았다면 알겠지만 각종 수학 이론을 이용해서 언어를 만들어 보자는 의도로 만들어진 언어이므로 수학과의 관련성은 어느 정도 있다. 그렇다고 해서 하스켈로 프로그래밍을 하기 위해 기저의 수학을 잘 알고 있어야 하는 것은 아니며, 실제로도 많은 하스켈 프로그래머들이 하스켈의 바탕이 되는 전공수학 및 논리를 따로 배우지 않고도 능히 현업에 종사하고 있다. 알면 도움되지만, 모른다고 해서 문제가 되는 것은 아니다. 쉽게 생각하면 한없이 쉽고 어렵게 생각하면 한없이 어려워진다고 보는 것이 맞다. 프로그래밍을 수학, 특히 수리논리에서 배운사람은 보통 람다대수(λ-calculus) 혹은 class of recursive functions 라는 함수체계를 통해 배운다. 당연히 이 시스템도 사이드이펙트는 전혀 없으며[* 말그대로 수학의 함수이다.] 심지어 built-in 조건문이나 루프문도 없다. 하지만 수학답게(?) 여러가지 트릭으로 존재하는 알고리듬은 모두 표현이 가능하다. 하스켈에도 람다대수가 어느 정도 반영되어 있으며, 아예 λ식이라는 개념도 있다.[* 사실 하스켈뿐 아니라, 모든 함수형 언어의 이론적 기반이 람다대수 라고 봐도 과언은 아니다.] 함수형 언어 하면 재귀부터 떠올리게 마련이고, 재귀에만 어느정도 익숙해지면 문제가 없을것같은 상상을 하는 경우가 많은데, 재귀보다 마스터하기 어려운것이 람다대수 의 η-reduction 과 partial application 을 이용한 여러가지 트릭들이다. 보통 함수를 "정의"할때 x y 등의 파라미터(parameter)를 명시하는데, η-reduction 과 partial application을 사용하면 많은 경우 저런 파라미터를 명시적으로 작성하지 않고 함수 기호만 갖고 함수를 정의하는게 가능해진다(point-free). 또한, (익숙한 사람들에 한해서) 상당히 직관적이며 코드 길이도 괴상할 정도로 축약되는 경우가 많아 유용성도 꽤 되는편이지만, 익숙하지 않은 프로그래머의 눈에는 거의 암호문이 되어버리므로, 함수형 언어를 사용하려면 제대로 알아두는 것이 좋다. 하스켈에서 사용하는 타입 시스템은 inductive structure[* 수학적 귀납법을 떠올리면 간단하다. 베이스가 되는 객체들이 있고, 그 객체들을 이용하여 A, B 가 타입이면 A→B 도 타입이다같은 정의를 주면, A 가 타입이면 A→A 가 타입이고, A→A 가 타입이면 (A→A)→A 혹은 (A→A)→(A→A) 가 타입이고...하는식으로 죽죽 나간다. 이런 정의를 inductive definition 이라 칭하며, 이런 시스템은 inductive structure 라고 한다. 가장 대표적인 예시는 당연히 자연수이다. ] 를 갖으므로, 수학에서 사용되는 type theory 와 보다 유사하다. 하스켈의 끝판왕이라 불리는 monad 역시 수학의 category theory 에서 가져왔으며, Co- 로 시작되는 여러가지 개념들도 역시 수학에서 쓰이는것들이다.[* Co- 로 시작되는것들은 mathematical dual 이라 하며, '대비되는 개념'정도로 이해할 수 있다. 예를 들어, data 의 dual 인 Codata, 재귀([[recursion|Recursion]])의 dual 인 Corecursion, 귀납의 dual 인 Coinduction 등이 있다. dual 을 구하는 방법은 그에 대한 정확한 수학적 정의를 논리식으로 풀어서 변환하는 방법이나 Category theory 로 정의한 후, arrow 의 방향을 바꿔서 얻어지는경우가 많다. ] 그리고, 가장 중요한 함수형 구조 자체가 위에 언급한 수학에서 알고리듬을 표현할때 자주 쓰인다. 덕분에 수학(수리논리)와 친근하다면 함수형 언어가 결코 낯설지 않을것이나, 모른다면 익숙해지기까지 진입장벽도 은근히 높은편이고 언어를 깊게 이해하기도 상당히 힘들어진다. 다만, 언어 자체에 대한 깊은 이해가 없더라도 프로그래밍을 하기에 큰 무리는 없으므로 부담을 갖지는 말자. 애초에 [[C++]]나 [[Java]] 같은 곳에 사용되는 컨셉들도 이론적으로 깊게 들어가면 수학 이상으로 충분히 복잡하다. 하지만, 프로그램을 만들려는 목적으로 그런 이론들을 잘 알지 못하고 개발을 한다고 해도 결과물을 만들어 낼 수 없는것은 아니다. 물론, 여기에는 각 언어 제작자들이 최대한 관련지식 없이 직관적으로 프로그래밍이 가능하도록 디자인을 하는것도 한 몫 한다. 하스켈 역시 저런 이론적인 내용이 아니라, 함수형 표현이나 재귀 등에 익숙해지는 것이 관건이다. 정리하자면, 컴퓨터의 탄생에는 20세기 초반의 수리논리학의 개념들이 영향을 주었는데, 하스켈은 더 나아가서 20세기 후반 이후[* 범주론이 대수학, 위상수학을 넘어 공리적 집합론에 버금가는 중요성을 갖는 수학기초론에 가까운 분야로 대두된 것은 아무리 빨리 잡아도 1960년대였다. [[니콜라 부르바키]]가 현대수학을 집대성할 때에도 범주론을 적극적으로 써먹어야 하느냐 마느냐로 키배가 끊이지 않았던 시절이었으며, 현재도 범주론은 공업수학 같은 속성 코스가 아닌 수학과 학부 고학년생 내지는 대학원생들이 공부하는 고급과정에서나 처음 등판하는 내용이다.]의 수학 및 수리논리학의 개념들까지 이용하고 있다고 보면 된다. [* 정적 타입 함수형 프로그래밍을 입문할 때 처음 배우는 기본 타입클래스 중 하나인 Applicative Functor가 2008년이 되어서야 수학적으로 발견되었을 정도이다.]저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기