모든 기능 프로그래밍 자습서가 왜 그렇게 수학적인가?


20

나는 함수형 프로그래밍과 대부분의 튜토리얼을 배우려고 노력했지만 더 복잡한 구문 (경우에 따라 간단한 구문)의 예제로 수학을 사용합니다. 왜 이런거야? 더 쉬운 것을 사용할 수 있다고 생각합니다. 배우기가 어렵습니다.

배경 정보 : 저는 12 년 동안 소프트웨어를 작성해 왔습니다. 저는 폐쇄, 일급 시민으로서의 기능 및 제네릭과 같은 일부 개념을 이해합니다. 일부 고급 레벨에서 고차 함수에 문제가있을 수 있지만 기본적인 이해가 필요합니다. Monads는 엉덩이에 나를 물고 있으며,이 시점에서 나는 그것을 지나치지 않았습니다 (내가 끈질 기 때문에 결국에는 확실 할 것입니다).


조금만, 나는 당신이 제안한 다른 3 가지 언어를 시도하지 않았습니다
Charles Lambert

C #을 알고 있다면 F #이 가장 쉬운 방법입니다. 큰 수학 지식을 요구하지 않습니다.
cnd

6
SICP를 사용해보십시오-고등학교 수학을 넘어서는 것은 아닙니다.
SK-logic

@Charles Lambert-OfficeSpace를 시청하면 Job의 의견 중 두 번째 부분이 표시됩니다.
Jetti

@Charles Lambert : 위대한 선을위한 Haskell을 배우는 것도 그리 수학적인 것은 아닙니다 : D
Matthieu M.

답변:


21

함수형 프로그래밍은 수학 구조를 모델링하는 데 매우 뛰어나고 특히 Lambda 미적분학과 같은 수학 개념과 밀접한 관련이 있기 때문에 수학을 사용합니다. 또한 I / O는 일반적으로 다양한 언어의 REPL을 통한 기능적 패러다임 수학의 많은 언어에서 상당히 가시적이고 고급 주제이므로 처음에는 언어를 가르치는 좋은 방법이됩니다.

함수형 프로그래밍은 함수를 프로그래밍 언어 내에서 첫 번째 클래스 구문으로 취급하므로 함수 생성이 매우 중요합니다. 따라서 그래프 이론에서 높은 수학은 상당히 중요합니다.

명령형 언어는 수학만큼이나 중요하지만 어쨌든 추가 할 수있는 기계에 더 가깝기 때문에 기본적으로 모두 산술적입니다. 추상화가 더 높은 기능적 언어는 수학에 더 적합합니다. 학계에서 일반적으로 사용하는 것은 많은 수학을 알고 있고 많은 수학을 배우기를 기대하는 사람들이 사용하고 가르치는 데 도움이되지 않습니다. 따라서 "멍청하게"말할 수는 있지만 이러한 요소는 거의 없습니다.

http://learnyouahaskell.com/- 아마도 함수형 프로그래밍에 대한 가장 쉬운 소개 중 하나 일 것입니다. 저는 두 번 확인했으며 기본 대수와 그래프 이론 외에는 아무것도 없습니다.


learnyousomeerlang.com 은 Haskell 이외의 다른 것을 원할 경우 옵션입니다.
트래비스

11

여러 가지 이유가 있으며 모두 관련이 있습니다.

  • 대부분의 기능적 프로그래밍 언어는 CS가 수학과 밀접한 관련이있는 학문적 맥락에서 개발되었으므로이를 디자인 한 사람들은 강력한 수학 배경을 가지고 있습니다 (청중에 대해 동일하게 가정하는 경향이 있음)
  • 함수형 프로그래밍은 수학 문제가 많은 문제를 해결하는 데 특히 적합한 패러다임입니다.
  • FP의 이론, 람다 미적분학 (기본적으로 함수의 추상 이론)은 수학의 한 부분이며, FP 언어는 람다 미적분학의 개념과 용어를 사용하는 경향이 있습니다.

또한 FP는 다른 패러다임보다 더 수학적으로 중요하지는 않지만 핵심 개념 (실제 일류 시민으로서의 기능, 고차 기능, 폐쇄 및 순도)에는 특정 사고 방식이 필요합니다. 어느 시점에서, 당신의 마음은 "클릭"으로 가야합니다. 이 4 가지 핵심 아이디어를 이해하면 나머지는 다른 패러다임과 마찬가지로 쉬울 것입니다.


3
학계에서 개발 된 +1 : 기능적 언어를 만드는 사람들은 수학적 특성에 기초를 두어 유출됩니다 .
Matthieu M.

@Matthieu M : 수학 속성에 기반한 프로그래밍 언어를 바탕으로 올바른 소프트웨어를 작성하고 개발 시간을 단축 할 수 있습니다. 예를 들어, 저는 C ++ 코드보다 Haskell 코드를 디버깅하는 데 시간이 덜 걸립니다. 개발 시간 (및 비용)을 줄이는 것은 일부 수학 학습 노력을 정당화 할 수있는 실질적인 이점입니다. tdammers가 지적했듯이 학습해야 할 몇 가지 추가 개념이 있지만 몇 가지 핵심 아이디어를 이해 한 후에 FP는 명령형 프로그래밍만큼 직관적입니다.
조르지오

나는 또한 수학 개념을 사용하여 명령형 언어를 설명 할 수있는 tdammers에 동의합니다. 실제로, 명령형 프로그램의 수학적 설명은 일반적으로 기능적 프로그램의 수학적 설명보다 훨씬 복잡합니다. IMO는 명령형 언어에 버그가 포함될 가능성이 높은 이유를 설명합니다. 명령형 코드를 완전히 이해하기가 더 어렵습니다. 적어도 이것은 몇 년 동안의 함수형 프로그래밍과 더 많은 년의 명령형 프로그래밍에 대한 개인적인 경험입니다.
조르지오

@Giorgio : "언어에 빠지다"(어떻게 든)와 "자습서에 빠지다"는 차이가 있습니다. 나는 많은 수학없이 함수형 프로그래밍 튜토리얼을 작성할 수 있다고 확신합니다. 물론 그들이 더 나아질 지 여부는 논란의 여지가 있고 아마도 주관적 일 것입니다.
Matthieu M.

@MatthieuM .: 누출로 인해 의미를 명확하게 해주셔서 감사합니다 (자습서에 들어옴). FP에 대한 자습서에는 가능한 한 적은 수학이 포함되어야한다는 데 동의합니다. 나는 어떻게 든 당신의 의견을 잘못 해석했다 : 산업계와 학계에서 일한 나는“학계에서는 실제 세계에서는 쓸모없는 많은 수학을한다”는 말에 약간 과민하다. 댓글과 tdammer의 답변 모두 +1
조르지오

5

근본적으로 컴퓨터 프로그래밍은 수학이기 때문입니다. 기능 언어는이를 염두에두고 설계되었으므로 많은 자습서가 수학에 중점을 둔 이유입니다.

컴퓨터 프로그래밍을 수학 기반으로 생각하는 데 익숙하지 않다면 배우기가 어렵습니다.


4
기본적으로 컴퓨팅은 논리와 산술의 조합입니다. 이것은 수학이 아닙니다. 수학 명령어로 분기 명령어를 표현할 수 없으므로 수학을 기반으로 할 수 없습니다. 함수형 프로그래밍 군중은 수학을 기반으로하기를 원하므로 분기 명령어가 존재하지 않는 것처럼 동작하는 프로그램 언어를 개발합니다.
James Anderson

9
@ 제임스 앤더슨, 논리와 산술이 수학이 아니라고 말하는가? 그리고 분기 명령을 포함하는 수많은 수학 공식을 보았습니다 (보통 스위치와 같은 형식으로 표현됨).
피터 테일러

4
산술 간단한 계산을 다루는 수학의 하위 집합입니다. 논리는 모든 합리적인 사고의 기초가되는 수학의 수퍼 세트입니다. 우연히 함수형 프로그래밍은 수학적으로 표현할 수있는 문제를 해결하는 것이 좋습니다. GAP (일반적으로 허용되는 회계 관행)와 같은 임의의 규칙에 대한 비논리적 인 혼란을 따르려고 할 때 그렇게 뜨겁지 않습니다.
James Anderson

6
@ ian31, " 기본적으로 " 라는 단어를 어떻게 정의 하시겠습니까? 토목 공학은 물리와 수학을 기반으로하지만 실제로 사람들이 사용하고 즐길 수있는 물건을 만드는 것입니다. 어떤 식 으로든 실제 문제에 대한 솔루션 프로그래밍에 대해 생각하기 전에 그 문제를 수학 공식으로 변환 해야합니다 . 다른 방법으로는 작동하지 않습니다. 프로그래밍은 형식주의에 관한 것입니다.
SK-logic

6
@ ian31에서 프로그래밍 언어 형식주의입니다. 그들의 행동은 엄격하게 정의되고 예측 가능합니다. 따라서 (모호한 경우에도) 특정 모델을 코딩하는 것은 일종의 형식주의로 바뀝니다. 잘 정의 된 엄격한 모델의 빛나는 크리스털 클리어 세계에 국한되어 있다는 일반적인 인식에도 불구하고 수학은이 모호한 영역으로 확장됩니다.
SK-logic

1

"The Little Schemer"는 함수형 프로그래밍에 대한 훌륭한 소개이며 전혀 수학적인 것은 아니라고 생각합니다. 그것은 Monads에 들어 가지 않으므로 귀하의 취향에 비해 너무 기본적 일 수 있지만 Y 조합을 끝까지 유도합니다.

나는 최근 12 년 전 대학에서 어떤 기능 프로그래밍을하지 않은 후에 그것을 겪었고, 그것은 매우 새로 고침되었습니다. 라켓을 사용하여 책의 대부분의 문제를 해결 한 후 더 진보 된 것을 해결할 준비가 된 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.