카테고리 이론은 함수형 프로그래밍 학습에 유용합니까?


118

나는 Haskell을 배우고 있으며 언어에 매료되어 있습니다. 그러나 나는 심각한 수학 또는 CS 배경이 없습니다. 그러나 저는 숙련 된 소프트웨어 프로그래머입니다.

하스켈에서 더 나아질 수 있도록 카테고리 이론을 배우고 싶습니다.

하스켈을 이해하기위한 좋은 기초를 제공하기 위해 카테고리 이론의 어떤 주제를 배워야합니까?



1
프로그래밍과 CSS를 구별 해 주셔서 감사합니다.
jmite

4
"하스켈에서 더 좋아지는 학습 범주 이론"은 "테니스에서 더 나은 학습 물리학"
user26756

답변:


114

Theorytical Computer Science site이전 답변에서 나는 범주 이론이 유형 이론의 "기초"라고 말했다. 여기서는 더 강한 것을 말하고 싶습니다. 범주 이론은 유형 이론 입니다. 반대로, 유형 이론은 카테고리 이론 입니다. 이 점을 확장하겠습니다.

범주 이론은 유형 이론입니다

형식화 된 공식 언어와 비공식 표기법을 사용하는 일반 수학에서도 형식으로 함수를 선언합니다 . 서면으로 암시하는 것은 와 가 "유형"이라고하고 가 한 유형에서 다른 유형으로 "함수" 라는 생각입니다 . 범주 이론은 이러한 "유형"과 "기능"의 대수 이론입니다. (공식적으로, 범주 이론은 그것들을 "객체"와 "형태"라고 부르며 전통 주의자들의 이론적 인 발가락을 밟지 않기 위해 점점 더 카테고리 이론가들이 바람에 그런주의를 기울이고보다 직관적 인 용어를 사용하는 것을 본다. "및"기능 ".A B ff:ABABf

우리는 모두 고등학교 이후의 이론을 제시했습니다. 따라서 와 와 같은 유형 을 집합으로, 와 같은 를 집합 이론적 매핑 으로 생각하는 데 익숙 합니다. 당신이 그런 식으로 생각하지 않으면, 당신은 좋은 모양입니다. 당신은 이론적 인 세뇌를 피했습니다. 범주 이론은 많은 종류와 종류의 기능이 있다고 말합니다. 따라서 세트 유형의 아이디어는 제한적입니다. 대신, 범주 이론은 유형과 기능을 대수적으로 공리 화합니다. 기본적으로 이것이 범주 이론입니다. 유형과 기능의 이론. 높은 수준의 추상화를 포함하여 상당히 정교 해집니다. 그러나 배울 수 있으면 유형과 기능에 대한 깊은 이해를 얻게됩니다.B fABf

유형 이론은 카테고리 이론입니다

"유형 이론"이란 용어는 엄격한 형식 형성 규칙에 따라 모든 유형을 확인하는 모든 형식의 공식 언어를 의미합니다. 우리가 그러한 언어로 일할 때마다 우리는 범주 이론 구조로 일하고 있음이 밝혀졌습니다. 우리는 이론적 인 표기법을 사용하고 이론적으로 생각한다고해도 여전히 범주에 맞는 내용을 작성하게됩니다. 그것은 놀라운 사실 입니다.

역사적으로 Dana Scott이이를 처음으로 인식했을 수도 있습니다. 그는 형식화 된 (및 형식화되지 않은) 람다 미적분학을 기반으로 프로그래밍 언어의 의미 론적 모델을 제작하는 작업을했습니다. 프로그래밍 언어에는 이론이 결여 된 무제한 재귀가 포함되기 때문에 전통적인 집합 이론적 모델은 이러한 목적에 적합하지 않았습니다. Scott은 프로그래밍 현상을 포착하는 일련의 의미 론적 모델을 발명했으며, 람다 미분법을 입력하면 직교 폐쇄 범주 라는 범주의 클래스를 정확하게 나타냅니다 . "집단 이론적"이 아닌 데카르트 폐쇄 범주가 많이 있습니다. 그러나 입력 된 람다 미적분은 모두 동일하게 적용됩니다. 스캇은 " 람다 미적분학 관련 이론 "이라는 멋진 에세이를 썼습니다"어떻게 진행되고 있는지 설명하고, 그 일부는 웹에서 구할 수있는 것으로 보인다. 원본 기사는"To HB Curry : 조합 논리, 람다 미적분학 및 형식론에 대한 에세이 ", Academic Press, 1980. Curien은 아마도 독립적으로 동일한 실현에 이르렀 으며 기능적 언어를 구현할 때 이러한 아이디어를 사용하기 위해 범주 형 추상 기계 (CAM)를 정의했으며 , 구현 한 언어를 Microsoft의 F # 의 기본 프레임 워크 인 "CAML"이라고했습니다 .

, , 등과 같은 표준 유형 생성자 는 functors 입니다. 즉, 형식을 형식에 매핑 할뿐만 아니라 형식 간 함수를 형식 간 함수에 매핑합니다. 다형성 함수 는 functor 조치로 인한 모든 해당 함수를 보존합니다. 카테고리 이론은 1950 년대에 Eilenberg와 MacLane에 의해 발명되었습니다.L i s t×List다형성 함수의 개념을 공식화합니다. 그것들은 그것들을 타입 변수를 사용하여 타입-올바른 방식으로 작성할 수있는 유일한 것이기 때문에 "자연적 변환", "자연적"이라고 불렀습니다. 따라서 프로그래밍 언어가 시작되기 전에도 범주 이론이 다형성 프로그래밍 언어를 공식화하기 위해 정확하게 고안되었다고 말할 수 있습니다!

집합 이론적 전통 주의자는 집합 이론 표기법을 사용할 때 표면 아래에서 진행되는 펑터와 자연 변환에 대해 알지 못합니다. 그러나 타입 시스템을 충실하게 사용하는 한, 실제로 인식하지 않고 범주 구조를 수행하고 있습니다.


범주 이론은 유형과 함수의 전형적인 수학적 이론입니다. 따라서 모든 프로그래머는 약간의 범주 이론, 특히 기능 프로그래머를 배우면 도움이 될 수 있습니다. 불행히도, 프로그래머를 대상으로 한 카테고리 이론에 대한 교과서는 없습니다. "컴퓨터 과학에 대한 범주 이론"책은 일반적으로 이론적 인 컴퓨터 과학 학생 / 연구자를 대상으로합니다. 컴퓨터 과학자를위한 기본 범주 이론 인 Benjamin Pierce의 저서 가 아마도 가장 읽기 쉽다.

그러나 웹에는 프로그래머를 대상으로하는 많은 리소스가 있습니다. Haskellwiki 페이지는 좋은 출발점이 될 수 있습니다. 상기 미들랜드 대학원 , 우리는 (다른 사람의 사이에서) 카테고리 이론에 대한 강의가 있습니다. Graham Hutton의 과정은 "초보자"과정으로 페깅되었으며 광산은 "고급"과정으로 페깅되었습니다. 그러나 둘 다 본질적으로 동일한 내용을 다루며 깊이가 다릅니다. University of Chalmers에는 전 세계의 도서 및 강의 노트에 대한 유용한 리소스 페이지 가 있습니다. "sigfpe"열정적 인 블로그 사이트는 또한 프로그래머의 관점에서 많은 좋은 직관을 제공합니다.

배우고 자하는 기본 주제는 다음과 같습니다.

  • 카테고리 정의 및 카테고리 예
  • 펑터 및 그 예
  • 자연 변형과 그 예
  • 제품, 코 프로덕트 및 지수 (함수 공간), 초기 및 터미널 객체의 정의.
  • 부속물
  • 모나드, 대수 및 Kleisli 카테고리

내 자신의 강의 노트 에서 미들랜드 대학원 마지막 (모나드)를 제외하고 모든 주제를 다룹니다. 요즘 모나드에 사용할 수있는 다른 리소스가 많이 있습니다. 따라서 큰 손실이 아닙니다.

수학이 많을수록 범주 이론을 배우기가 더 쉬워집니다. 범주 이론은 수학적 구조에 대한 일반적인 이론이므로 정의의 의미를 이해하기 위해 몇 가지 예를 아는 것이 도움이됩니다. (범주 이론을 배웠을 때 나는 표준 교재에는 수학적인 예가 있었기 때문에 프로그래밍 언어 의미에 대한 지식을 사용하여 나만의 예를 만들어야했습니다.) 그 후 Lambek의 훌륭한 책이 나왔습니다. Scott은 " 범용 논리 소개 ""타입 시스템과 카테고리 이론을 연관시키는 것 ("논리 "라고 부름). 이제 많은 예제를 모르더라도 타입 시스템과 관련시켜 카테고리 이론을 이해할 수 있습니다. 위에서 언급 한 많은 리소스가 이것을 사용합니다. 범주 이론을 설명하는 접근법.


3
@UdayReddy 나는 타입 이론을 가진 범주 이론의 당신의 식별에 강력히 동의하지 않습니다. 현대 유형 이론은 동시성 프로세스의 유형, 예를 들어 세션 유형의 이론 전통에 관한 것입니다. 내가 아는 한, 그러한 타이핑 시스템에 대한 범주 적 이해는 없습니다.
Martin Berger

6
@MartinBerger "유형 이론"에 대한 당신의 해석은 약간 좁다 고 생각합니다. 그러나 세션 유형에 대한 적절한 유형 이론 및 범주 이론적 이해가 현재 좋은 연구 과제이며 시간을 할애한다는 데 동의합니다.
Uday Reddy

2
@MartinBerger. 카테고리 이론이 더 풍부한 계산 개념에 어떻게 적용되는지 확인하려면 명령 프로그래밍과 게임 의미론에 적용되는 방법을 살펴보십시오. 따라서 함수형 프로그래밍에는 범주 이론에 대한 독점이 있다고 생각하지 않습니다.
Uday Reddy

1
@nicolas, 섬유화는 색인화 된 카테고리를 수행하는 방법으로, 종속 유형을 모델링합니다. 또한 진동은 매우 일반적인 형태의 프로그램 로직으로 볼 수 있습니다. 여기서 는 가 만족 값을 만족 값에 매핑 한다는 것을 의미 합니다. f P Qf:PQfPQ
Uday Reddy

2
"불행히도, 프로그래머를 대상으로하는 카테고리 이론에 관한 교과서는없는 것 같습니다." 이러한 "교과서"는 현재 Bartosz Milewski의 프로그래머를위한 범주 이론에 거의 존재하지 않습니다 . Bartosz도 함께 강의 시리즈를 만들었습니다 .
alx9r

30

나는 짧고 달콤하게 노력할 것입니다. Haskell 프로그램과 특정 범주의 클래스 간에는 비공식적으로 일치하는 내용이 있으며 일부 작업을 통해보다 공식적으로 만들 수 있습니다. 이 서신을 Curry-Howard-Lambek 서신이라고하며 다음과 관련이 있습니다.

  1. 하스켈의 종류개체 범주의
  2. 용어 형 와 morphisms의 (동일한 표기법 주)f : A BAB f:AB
  3. 대수 데이터 유형초기 객체
  4. 타입 생성자
  5. 기타

목록은 계속 이어지지 만 한 가지 중요한 점은 범주 이론에서 모나드대수 와 같은 것을 정의 하고 수학자에게 유용하지만 하스켈 프로그래밍 연습에 널리 퍼져있는 개념을 제시 할 수 있다는 것입니다.

컴퓨터 과학자의 범주에 대한 완전히 만족스러운 입문서를 찾지 못했기 때문에 어떤 책을 추천해야할지 모르겠습니다. Asperti와 Longo로 카테고리, 유형 및 구조 를 시도 할 수 있습니다 . 아이디어는 부속 정의까지 기본 정의를 학습 한 다음, 이러한 개념을 이해하고 이해하기 위해 훌륭한 블로그를 찾아 보는 것 입니다.


1
"수학자에게도 유용하지만 Haskell 프로그래밍 실행에 널리 퍼져있는 개념"-예를 들거나 너무 많은 사전 지식이 필요한 개념이 있습니까?
Raphael

7
@Raphael : Monads. 화살표. 대수. 대수학.
Dave Clarke

6
Functors, 이원성, Kleisli 범주, 요 네다 레 메마 ...
cody

4
Cartesion은 카테고리를 닫았습니다. 카레.
Dave Clarke

2
"소프트웨어 엔지니어를위한 카테고리 이론 소개", cs.toronto.edu/~sme/presentations/cat101.pdf
Vladimir Alexiev

29

@AJed 조언을 에코, 나는 당신의 진술을 설정하는 것이 좋습니다

I want to learn category theory so I can become better at Haskell.

머릿속에서 : 프로그래밍 직관을 바탕으로 Haskell을 배우십시오. FP 전문가 인 경우 카테고리 이론을 선택하는 것이 더 쉬울 수 있습니다 (여전히 관심이있는 경우).

범주 이론은 광범위한 수학 교육 (그룹, 링, 모듈, 벡터 공간, 토폴로지 등)을 가진 사람에게는 간단합니다. 이러한 배경이 없기 때문에 범주 이론은 거의 타의 추종을 불허합니다. 범주 이론의 장점은 겉보기에는 관련이없는 많은 것들을 통합한다는 것입니다 (예 : 잊혀진 펑터의 왼쪽 인접 부분에는 자유 그룹, 보편적 인 포괄 대수, 스톤 체크 (Stone-Cech) 소형화, 그룹의 무력화 등이 포함됨) 복잡성이 줄어 듭니다. 그러나 범주 이론이 통합하는 여러 예에 익숙하지 않은 경우 범주 이론은 삶을 더욱 어렵게 만드는 추가 복잡성 계층 일뿐입니다.

내 경험상, 이미 알고있는 것을 바탕으로 학습이 쉬워졌습니다. 소프트웨어 개발자는 프로그래밍에 대해 많은 것을 알고 있으며 Haskell 프로그래밍은 다른 프로그래밍과 다르지 않으므로 카테고리 이론을 무시하고 실용적인 프로그래밍 관점에서 Haskell에 접근하는 것이 좋습니다. 하스켈에있는 약간의 범주 이론, 예를 들어 모나드에 대한 일부 지원은 범주 이론을 통해 우회하지 않고도 프로그래머가 이해하기 훨씬 쉽습니다. 결국 모나드는 일반화 된 구성 일뿐입니다 (아직 모르는 사이에도 프로그래밍 연습에서 모나드를 사용했을 것입니다). 하스켈은 모나드 법을 시행하지 않기 때문에 실제로 모나드를 지원하지 않습니다.


7
아닙니다. 솔직히 말하면 Haskell 다른 프로그래밍 언어와는 다른 점으로, 선입견을 뛰어 넘는 것이 가장 큰 과제라는 점에서 다릅니다. 숙련 된 소프트웨어 개발자는 이전에 프로그래밍 한 적이없는 사람보다 문제가있는 것 같습니다.
CA McCann

5
@CAMcCann 일부 숙련 된 프로그램이 Java 또는 C #에서 Haskell로 이동하는 데 어려움을 겪는 것으로 보이지만 Haskell과 근본적으로 다른 점이 있다고 생각하지 않습니다. 나는 그것이 다른 것처럼 보이기 때문에 부분적이라고 생각합니다 . Haskell을 이해하기 위해 카테고리 이론을 배워야한다는 아이디어는 아마도 숙련 된 소프트웨어 개발자가 Haskell의 숙달을 얻지 못했을 수도 있습니다. (F.에 모나드가없는 이유 참조) 다른 언어로 닮은 점이없는 많은 Haskell 기능을 생각하기는 어렵다.
Martin Berger

5
범주 이론을 아는 것이 도움이 될 수 있지만 그다지 많은 것은 아니며, 그것을 배우는 것은 Haskell을 배우는 것보다 훨씬 어렵습니다. 대부분의 언어 (순도, 엄격하지 않은 평가, 유형 시스템)와 비교할 때 근본적인 차이가 있으며 모든 CT 용어를 제거해도 더 친숙하지 않습니다. 반면에 하스켈을 배우면 빌린 아이디어가 유용 하기 때문에 일부 사람들이 일부 CT를 배우도록 동기를 부여 합니다 . F #의 제한된 유형 시스템과 완벽하게 좋은 기존 용어를 ​​피하는 것은 기능이 아니라 결함입니다.
CA McCann

1
나는 Haskell과 비슷한 유형 시스템을 가진 Scala 이외의 다른 언어를 모른다. 경험적 관찰에서 순도는 즉시 파악 되지 않으며 엄격하지 않은 평가 (당신이 건너 뛴)는 훨씬 더 어렵다. 마지막으로, 나는 나는 일하는 프로그래머와 그 이의를 제기 누구 분야가 겁 것입니다 이름 . 소프트웨어 개발 산업은 이미 불투명 한 전문 용어로 가득합니다. 또한 F #의 타입 시스템은 모나드를 직접 표현할 수 없습니다. 계산 표현식은 일류가 아니므로 사용이 크게 제한됩니다.
CA McCann

2
CBN은 개념적으로 쉽다. 예를 들어 대부분의 작업 프로그래머가 이전에 사용했던 개념 인 썽킹 (thunking)과 유사하다. 순도는 모든 작업 프로그래머가 이해하는 것입니다. Haskell은 영국의 학부 교육에 사용됩니다. 학생들이 함수형 프로그래밍을하는 방법을 물어 보면 Haskell을 먼저 배우는 것이 좋습니다. 그러나 학생들은 그 질문의 창시자처럼 명성에 겁먹습니다. 이것이 주된 이유는 하스켈과 범주 이론의 연관성이라고 생각합니다.
Martin Berger

13

짧은 대답 : 아니요 [그러나 이것은 의견 일뿐입니다]

Haskell을 능숙하게 만들기 위해 카테고리 이론이나 다른 이론적 영역으로 가지 마십시오. 꼬리 재귀,지도, 축소 등과 같은 기능적 프로그래밍 기술을 배웁니다. 최대한 많은 코드를 읽으십시오. 최대한 많은 아이디어를 구현하십시오. 문제가 있으면 읽고 읽으십시오.

Haskell과 다른 함수형 프로그래밍 패러다임을 배우기 위한 좋은 이론적 참고 자료 를 원한다면 Lambda Calculus를 통한 함수형 프로그래밍 소개, Greg Michaelson (온라인에서 제공)을 살펴보십시오. ... 다른 비슷한 책이 있습니다.


1
"꼬리 재귀"는 일반적으로 게으름 때문에 Haskell에서 프로그래밍하는 데 중요하지 않기 때문에 눈썹을 올립니다. 그럼에도 불구하고, "함께 배우는"것은 거의 항상 좋은 조언입니다.
Dan Burton

@ DanBurton .. 흥미로운 관찰. Haskell 대신 erlang 또는 scheme :)을 배우십시오. [저는 Haskell의 전문가가 아닙니다. 시원하게 들리기 때문에 선택했습니다.]
AJed


0

범주 이론은 매우 복잡한 수학의 분기이며 마스터 링하면 이전 학습의 대부분을 동일한 추상 객체의 인스턴스로 만들어 통합 할 것입니다. 매우 유용하고 직관적입니다. 그러나 그것은 광범위하고 광범위하며, 어떤 것이 당신의 요구에 적합한 지, 어느 것을 건너 뛸지를 알지 못하는 많은 새로운 개념에 빠져 있습니다. 따라서 목적에 맞는 접근 방식은 개념 중에서 선택해야합니다. 그렇지 않으면 개념을 마스터하는 데 필연적으로 오랜 시간이 필요하며 실제로 자체 학습 영역이 아닙니다.

그건 그렇고, 나는 당신의 목적이 여기에 있는 아주 좋은 출발점을 제안합니다 .


이것은 실제로 질문에 대답하지 않습니다 : 함수형 프로그래밍 학습에 유용합니까? 카테고리 이론에서 Haskell에 유용한 주제는 무엇입니까?
David Richerby
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.