나는 Haskell을 배우고 있으며 언어에 매료되어 있습니다. 그러나 나는 심각한 수학 또는 CS 배경이 없습니다. 그러나 저는 숙련 된 소프트웨어 프로그래머입니다.
하스켈에서 더 나아질 수 있도록 카테고리 이론을 배우고 싶습니다.
하스켈을 이해하기위한 좋은 기초를 제공하기 위해 카테고리 이론의 어떤 주제를 배워야합니까?
나는 Haskell을 배우고 있으며 언어에 매료되어 있습니다. 그러나 나는 심각한 수학 또는 CS 배경이 없습니다. 그러나 저는 숙련 된 소프트웨어 프로그래머입니다.
하스켈에서 더 나아질 수 있도록 카테고리 이론을 배우고 싶습니다.
하스켈을 이해하기위한 좋은 기초를 제공하기 위해 카테고리 이론의 어떤 주제를 배워야합니까?
답변:
Theorytical Computer Science site 의 이전 답변에서 나는 범주 이론이 유형 이론의 "기초"라고 말했다. 여기서는 더 강한 것을 말하고 싶습니다. 범주 이론은 유형 이론 입니다. 반대로, 유형 이론은 카테고리 이론 입니다. 이 점을 확장하겠습니다.
범주 이론은 유형 이론입니다
형식화 된 공식 언어와 비공식 표기법을 사용하는 일반 수학에서도 형식으로 함수를 선언합니다 . 서면으로 암시하는 것은 와 가 "유형"이라고하고 가 한 유형에서 다른 유형으로 "함수" 라는 생각입니다 . 범주 이론은 이러한 "유형"과 "기능"의 대수 이론입니다. (공식적으로, 범주 이론은 그것들을 "객체"와 "형태"라고 부르며 전통 주의자들의 이론적 인 발가락을 밟지 않기 위해 점점 더 카테고리 이론가들이 바람에 그런주의를 기울이고보다 직관적 인 용어를 사용하는 것을 본다. "및"기능 ".A B f
우리는 모두 고등학교 이후의 이론을 제시했습니다. 따라서 와 와 같은 유형 을 집합으로, 와 같은 를 집합 이론적 매핑 으로 생각하는 데 익숙 합니다. 당신이 그런 식으로 생각하지 않으면, 당신은 좋은 모양입니다. 당신은 이론적 인 세뇌를 피했습니다. 범주 이론은 많은 종류와 종류의 기능이 있다고 말합니다. 따라서 세트 유형의 아이디어는 제한적입니다. 대신, 범주 이론은 유형과 기능을 대수적으로 공리 화합니다. 기본적으로 이것이 범주 이론입니다. 유형과 기능의 이론. 높은 수준의 추상화를 포함하여 상당히 정교 해집니다. 그러나 배울 수 있으면 유형과 기능에 대한 깊은 이해를 얻게됩니다.B f
유형 이론은 카테고리 이론입니다
"유형 이론"이란 용어는 엄격한 형식 형성 규칙에 따라 모든 유형을 확인하는 모든 형식의 공식 언어를 의미합니다. 우리가 그러한 언어로 일할 때마다 우리는 범주 이론 구조로 일하고 있음이 밝혀졌습니다. 우리는 이론적 인 표기법을 사용하고 이론적으로 생각한다고해도 여전히 범주에 맞는 내용을 작성하게됩니다. 그것은 놀라운 사실 입니다.
역사적으로 Dana Scott이이를 처음으로 인식했을 수도 있습니다. 그는 형식화 된 (및 형식화되지 않은) 람다 미적분학을 기반으로 프로그래밍 언어의 의미 론적 모델을 제작하는 작업을했습니다. 프로그래밍 언어에는 이론이 결여 된 무제한 재귀가 포함되기 때문에 전통적인 집합 이론적 모델은 이러한 목적에 적합하지 않았습니다. Scott은 프로그래밍 현상을 포착하는 일련의 의미 론적 모델을 발명했으며, 람다 미분법을 입력하면 직교 폐쇄 범주 라는 범주의 클래스를 정확하게 나타냅니다 . "집단 이론적"이 아닌 데카르트 폐쇄 범주가 많이 있습니다. 그러나 입력 된 람다 미적분은 모두 동일하게 적용됩니다. 스캇은 " 람다 미적분학 관련 이론 "이라는 멋진 에세이를 썼습니다"어떻게 진행되고 있는지 설명하고, 그 일부는 웹에서 구할 수있는 것으로 보인다. 원본 기사는"To HB Curry : 조합 논리, 람다 미적분학 및 형식론에 대한 에세이 ", Academic Press, 1980. Curien은 아마도 독립적으로 동일한 실현에 이르렀 으며 기능적 언어를 구현할 때 이러한 아이디어를 사용하기 위해 범주 형 추상 기계 (CAM)를 정의했으며 , 구현 한 언어를 Microsoft의 F # 의 기본 프레임 워크 인 "CAML"이라고했습니다 .
, , 등과 같은 표준 유형 생성자 는 functors 입니다. 즉, 형식을 형식에 매핑 할뿐만 아니라 형식 간 함수를 형식 간 함수에 매핑합니다. 다형성 함수 는 functor 조치로 인한 모든 해당 함수를 보존합니다. 카테고리 이론은 1950 년대에 Eilenberg와 MacLane에 의해 발명되었습니다.→ L i s t다형성 함수의 개념을 공식화합니다. 그것들은 그것들을 타입 변수를 사용하여 타입-올바른 방식으로 작성할 수있는 유일한 것이기 때문에 "자연적 변환", "자연적"이라고 불렀습니다. 따라서 프로그래밍 언어가 시작되기 전에도 범주 이론이 다형성 프로그래밍 언어를 공식화하기 위해 정확하게 고안되었다고 말할 수 있습니다!
집합 이론적 전통 주의자는 집합 이론 표기법을 사용할 때 표면 아래에서 진행되는 펑터와 자연 변환에 대해 알지 못합니다. 그러나 타입 시스템을 충실하게 사용하는 한, 실제로 인식하지 않고 범주 구조를 수행하고 있습니다.
범주 이론은 유형과 함수의 전형적인 수학적 이론입니다. 따라서 모든 프로그래머는 약간의 범주 이론, 특히 기능 프로그래머를 배우면 도움이 될 수 있습니다. 불행히도, 프로그래머를 대상으로 한 카테고리 이론에 대한 교과서는 없습니다. "컴퓨터 과학에 대한 범주 이론"책은 일반적으로 이론적 인 컴퓨터 과학 학생 / 연구자를 대상으로합니다. 컴퓨터 과학자를위한 기본 범주 이론 인 Benjamin Pierce의 저서 가 아마도 가장 읽기 쉽다.
그러나 웹에는 프로그래머를 대상으로하는 많은 리소스가 있습니다. Haskellwiki 페이지는 좋은 출발점이 될 수 있습니다. 상기 미들랜드 대학원 , 우리는 (다른 사람의 사이에서) 카테고리 이론에 대한 강의가 있습니다. Graham Hutton의 과정은 "초보자"과정으로 페깅되었으며 광산은 "고급"과정으로 페깅되었습니다. 그러나 둘 다 본질적으로 동일한 내용을 다루며 깊이가 다릅니다. University of Chalmers에는 전 세계의 도서 및 강의 노트에 대한 유용한 리소스 페이지 가 있습니다. "sigfpe" 의 열정적 인 블로그 사이트는 또한 프로그래머의 관점에서 많은 좋은 직관을 제공합니다.
배우고 자하는 기본 주제는 다음과 같습니다.
내 자신의 강의 노트 에서 미들랜드 대학원 마지막 (모나드)를 제외하고 모든 주제를 다룹니다. 요즘 모나드에 사용할 수있는 다른 리소스가 많이 있습니다. 따라서 큰 손실이 아닙니다.
수학이 많을수록 범주 이론을 배우기가 더 쉬워집니다. 범주 이론은 수학적 구조에 대한 일반적인 이론이므로 정의의 의미를 이해하기 위해 몇 가지 예를 아는 것이 도움이됩니다. (범주 이론을 배웠을 때 나는 표준 교재에는 수학적인 예가 있었기 때문에 프로그래밍 언어 의미에 대한 지식을 사용하여 나만의 예를 만들어야했습니다.) 그 후 Lambek의 훌륭한 책이 나왔습니다. Scott은 " 범용 논리 소개 ""타입 시스템과 카테고리 이론을 연관시키는 것 ("논리 "라고 부름). 이제 많은 예제를 모르더라도 타입 시스템과 관련시켜 카테고리 이론을 이해할 수 있습니다. 위에서 언급 한 많은 리소스가 이것을 사용합니다. 범주 이론을 설명하는 접근법.
나는 짧고 달콤하게 노력할 것입니다. Haskell 프로그램과 특정 범주의 클래스 간에는 비공식적으로 일치하는 내용이 있으며 일부 작업을 통해보다 공식적으로 만들 수 있습니다. 이 서신을 Curry-Howard-Lambek 서신이라고하며 다음과 관련이 있습니다.
목록은 계속 이어지지 만 한 가지 중요한 점은 범주 이론에서 모나드 및 대수 와 같은 것을 정의 하고 수학자에게 유용하지만 하스켈 프로그래밍 연습에 널리 퍼져있는 개념을 제시 할 수 있다는 것입니다.
컴퓨터 과학자의 범주에 대한 완전히 만족스러운 입문서를 찾지 못했기 때문에 어떤 책을 추천해야할지 모르겠습니다. Asperti와 Longo로 카테고리, 유형 및 구조 를 시도 할 수 있습니다 . 아이디어는 부속 정의까지 기본 정의를 학습 한 다음, 이러한 개념을 이해하고 이해하기 위해 훌륭한 블로그를 찾아 보는 것 입니다.
@AJed 조언을 에코, 나는 당신의 진술을 설정하는 것이 좋습니다
I want to learn category theory so I can become better at Haskell.
머릿속에서 : 프로그래밍 직관을 바탕으로 Haskell을 배우십시오. FP 전문가 인 경우 카테고리 이론을 선택하는 것이 더 쉬울 수 있습니다 (여전히 관심이있는 경우).
범주 이론은 광범위한 수학 교육 (그룹, 링, 모듈, 벡터 공간, 토폴로지 등)을 가진 사람에게는 간단합니다. 이러한 배경이 없기 때문에 범주 이론은 거의 타의 추종을 불허합니다. 범주 이론의 장점은 겉보기에는 관련이없는 많은 것들을 통합한다는 것입니다 (예 : 잊혀진 펑터의 왼쪽 인접 부분에는 자유 그룹, 보편적 인 포괄 대수, 스톤 체크 (Stone-Cech) 소형화, 그룹의 무력화 등이 포함됨) 복잡성이 줄어 듭니다. 그러나 범주 이론이 통합하는 여러 예에 익숙하지 않은 경우 범주 이론은 삶을 더욱 어렵게 만드는 추가 복잡성 계층 일뿐입니다.
내 경험상, 이미 알고있는 것을 바탕으로 학습이 쉬워졌습니다. 소프트웨어 개발자는 프로그래밍에 대해 많은 것을 알고 있으며 Haskell 프로그래밍은 다른 프로그래밍과 다르지 않으므로 카테고리 이론을 무시하고 실용적인 프로그래밍 관점에서 Haskell에 접근하는 것이 좋습니다. 하스켈에있는 약간의 범주 이론, 예를 들어 모나드에 대한 일부 지원은 범주 이론을 통해 우회하지 않고도 프로그래머가 이해하기 훨씬 쉽습니다. 결국 모나드는 일반화 된 구성 일뿐입니다 (아직 모르는 사이에도 프로그래밍 연습에서 모나드를 사용했을 것입니다). 하스켈은 모나드 법을 시행하지 않기 때문에 실제로 모나드를 지원하지 않습니다.
짧은 대답 : 아니요 [그러나 이것은 의견 일뿐입니다]
Haskell을 능숙하게 만들기 위해 카테고리 이론이나 다른 이론적 영역으로 가지 마십시오. 꼬리 재귀,지도, 축소 등과 같은 기능적 프로그래밍 기술을 배웁니다. 최대한 많은 코드를 읽으십시오. 최대한 많은 아이디어를 구현하십시오. 문제가 있으면 읽고 읽으십시오.
Haskell과 다른 함수형 프로그래밍 패러다임을 배우기 위한 좋은 이론적 참고 자료 를 원한다면 Lambda Calculus를 통한 함수형 프로그래밍 소개, Greg Michaelson (온라인에서 제공)을 살펴보십시오. ... 다른 비슷한 책이 있습니다.
다음은 카테고리 이론 아이디어가 실제 프로그래밍과 어떻게 관련되는지에 대한 동기 부여를 제공하는 (긴) 블로그 게시물입니다. http://cdsmith.wordpress.com/2012/04/18/why-do-monads-matter/
범주 이론은 매우 복잡한 수학의 분기이며 마스터 링하면 이전 학습의 대부분을 동일한 추상 객체의 인스턴스로 만들어 통합 할 것입니다. 매우 유용하고 직관적입니다. 그러나 그것은 광범위하고 광범위하며, 어떤 것이 당신의 요구에 적합한 지, 어느 것을 건너 뛸지를 알지 못하는 많은 새로운 개념에 빠져 있습니다. 따라서 목적에 맞는 접근 방식은 개념 중에서 선택해야합니다. 그렇지 않으면 개념을 마스터하는 데 필연적으로 오랜 시간이 필요하며 실제로 자체 학습 영역이 아닙니다.
그건 그렇고, 나는 당신의 목적이 여기에 있는 아주 좋은 출발점을 제안합니다 .