모국어로 기능 다른 패러다임 이전에 함수형 프로그래밍

다른 패러다임 이전에 함수형 프로그래밍 학습에 대한 장단점은 무엇입니까?



답변

하나의 주요 문제는 Haskell과 같은 언어로 시작하면 다른 모든 것이 표준 이하로 보일 것입니다.

솔직히 저는 Haskell이나 체계와 같은 언어로 시작하는 것이 좋은 생각이라고 생각합니다.

(나는 기능 언어 중독자임을 인정한다) 편집 :

두 언어에 대해 내가 좋아하는 것 :

Scheme 은 매우 간단한 언어를 사용하며 개발을 위해 놀랍도록 강력한 언어를 구축합니다. 또한 SICP는 학습에 대한 가치가있는 체계에 대해 작성되었습니다. 체계는 완전한 언어가 될 수 있다고 생각할 수있는 가장 간단한 것입니다.

Haskell 실제로 성장하고있는 것은 유형 시스템입니다. 다른 언어에서 볼 수있는 많은 버그는 잘못된 유형이 어딘가에 나타나기 때문입니다. 하스켈에서는 거의 불가능합니다. 또한 게으른 언어에 대한 아이디어는 멋진 것들이 빠져 나옵니다. 예를 들어 Haskell에서 무한한 데이터 구조를 만든 다음 필요한 부분 만 만들 수 있습니다.


답변

OOP 언어를 배우기 전에 기능 언어를 배우는 것의 가장 큰 장점은 프로그래밍 기술을 먼저 개발 한 다음 OOP 개념을 쉽게 파악할 수 있다는 것입니다. OOP 언어로 시작하면 “코드에 대해 생각하기”와 “ODD에 대해 생각하기”라는 두 가지를 동시에 배워야합니다. 주의가 산만해질 수 있습니다. 기능적 언어로 먼저 연습하고 프로그래밍 기술을 개발하십시오. 그런 다음 OOP 및 기타 패러다임을 배웁니다. OOP는 구조 프로그래밍의 부족을 보완하기 위해 고안되었으므로 이유를 이해하기가 더 쉬울 것입니다. 이것이 CS 과정이 C로 시작한 다음 C ++로 진행하는 이유입니다.


답변

함수형 프로그래밍으로 시작하여 프로그래밍을 배우는 방법 에 대한 질문은 두 가지 고전적인 권장 사항입니다.

  • 첫 번째이자 명백한 것은 Abelson과 Sussman 의 고전적인 컴퓨터 프로그램 구조 및 해석이며 , CS에 대한 최고의 소개 중 하나이며 Scheme을 사용하여 기능적 관점에서 배웁니다. 그것은의 온라인 전체에서 사용할 . 여기에서 시작하지 않으면 여기로 가야합니다.

  • 더 부드러운 속도로 소프트웨어 분야에 초점을 둔보다 최근의 텍스트는 Matthew Felleisen과 Racket / PLT 팀의 많은 사람들이 라켓 언어를 사용하는 프로그램 설계 방법 입니다. 계획. 그건 온라인으로도 가능합니다 (가)에서 진행 한, 두 번째 버전 . 이 책은 DrRacket 프로그래밍 환경과 함께 사용하도록 설계되어 초보자와 전문가 모두가 코드를 실험 할 수있는 매우 친숙한 인터페이스를 제공한다는 이점이 있습니다.

의 질문에 함수형 프로그래밍 시작, 내가 가리 싶습니다 밥 하퍼의 블로그 . 카네기 멜론은 최근 기능 프로그래밍을 가르치기 위해 CS 커리큘럼을 수정했으며 Harper는 자신의 블로그에서 진행 상황을 다루고 있습니다. Standard ML의 정의를 뒷받침하는 사람들 중 한 사람으로서, 그는이 움직임에 대한 것이 분명하며, 그 이유를 잘 설명합니다.

마지막으로, 나는 다른 사람들이 동의하지 않을 수 있지만 Haskell을 먼저 배우지 않도록주의해야합니다. FP에 대한 Haskell의 순수한 접근 방식은 확실히 좋은 습관을 낳을 것이지만, 게으른 계산에 대한 언어의 초점이 초보자에게는 반드시 적합한 것은 아닙니다. 프로그래머로서 배우기 위해 배워야 할 첫 번째이자 가장 중요한 것 중 하나는 소스를 살펴봄으로써 프로그램이하는 일을 정확히 파악하고 동일한 문제에 대한 서로 다른 접근법의 상대적 비용에 대해 추론하는 것입니다. Haskell의 게으름 때문에이 두 가지 활동 모두 숙련 된 프로그래머에게도 다소 도전이됩니다. 마일리지가 다를 수 있습니다.


답변

FP로 시작할 때의 주요 장점 (또는 단점이 아님)은 대부분의 개념이 명령형 프로그래밍에도 적용될 수 있다는 것입니다. Realm of Racket 은 비디오 게임 유추를 사용하여 기능적 개념과 명령 적 개념을 모두 가르치며, 헌신적 인 학생들은 기능성 게임 (npi)뿐만 아니라 조건부, 재귀, 루프, ADT 및 이벤트 중심 디자인에 대한 확실한 이해가 가능합니다. 이러한 개념은 현대 프로그래밍에서 실제로 어디에나 존재하며 지속적으로 사용됩니다.

그러나 더 중요한 것은 고차 함수와 데이터 유형을 사용하여 FP가 뛰어나는 추상화를 인코딩하는 방법을 배우는 것입니다. 프로그램 설계 방법 은 유도를 통해 교육함으로써 이에 대한 독특한 접근 방식을 취합니다. 예를 들어, 학생들 fold은 목록의 합계와 곱을 모두 가져와 공통 항목을 찾고 구현 자체를 도출하는 코드를 살펴보면 작동 방식을 배웁니다 .

위와 동등한 OOP에는 인터페이스, 추상 클래스, 제네릭, 펑터 또는 (잘못하는 경우) 싱글 톤 중 하나 이상이 포함될 수 있습니다. 이것들은 Java에서 완벽하게 수용 가능한 디자인 패턴이지만 IMHO는 입문 교과 과정에 속하지 않으며 기본 원칙을 난독 처리하는 역할 만합니다. FP 언어를 “늦게”소개 한 사람이라도 강력한 기능적 앵커를 통해 끊임없이 변화하는 OOP 바다를 탐색하는 것이 훨씬 쉬워 졌다고 말할 수 있습니다.


답변

함수형 프로그래밍으로 작업이 훨씬 쉬워집니다. OOP 언어에서는 해당 상태를 망치지 않고 여러 스레드에서 상태를 관리해야합니다. 기능적 언어에서 수행되는 대부분의 작업이 순수한 기능으로 수행되는 경우 걱정할 필요가 없습니다.

속도 / 성능 측면에서, 나는 실제 성능 기수는 아니지만 기능적이라는 것은 느리다는 것을 의미하지 않으며 기능적 언어의 구조는 속도와 거의 관련이 없습니다. 기능적 언어의 구문은 Clojure와 Haskell의 차이점과 같이 크게 다릅니다. Clojure는있는 그대로 매우 빠르며 사후 최적화를 통해 Java의 속도에 도달하거나 때로는 초과 할 수 있습니다.

그래서 그것은 모두 당신이 찾고있는 것에 달려 있습니다.


답변

프로그래밍 언어를 학습 할 때 학습 자료, 유용한 코드 샘플 및 멘토의 가용성이 매우 중요하다고 생각합니다. 상황에 따라 가르쳐 줄 수있는 멘토 등이있을 수 있지만 주류 언어에 비해 기능적 언어 자원이 거의 없다고 생각합니다. 그것은 당신이 주류 언어를 배우는 것에 비해 느리게 진행한다는 것을 의미합니다. 그러나 서두르지 않으면 이것이 문제가되지 않습니다.


답변

함수형 프로그래밍 언어 학습을 고려해야하는 가장 중요한 이유는 대수 데이터 형식에 대한 이해 일 것입니다. 멘탈 매핑은 OO 클래스 관계 및 데이터베이스 디자인 모델링에 도움이됩니다.

멀티 코어 / 멀티 프로세서 시스템에 중점을 둔 것은 FP에서보다 명확하고 간결하게 표현 될 수있는 병렬 알고리즘의 사용을 강조합니다. 언어의 람다 지점은 향후 1 ~ 20 년 동안 사용이 크게 증가 할 것으로 보입니다.

그러나 몇 가지 일반적인 함정도 있습니다. 공간과 시간의 복잡성을 계산하고 정지 증거를 제공하는 것이 람다 미적분학, 특히 게으른 평가를 지원하는 언어에서 훨씬 더 어려울 수 있기 때문에 FP가 더 단순하다고 생각하는 것은 큰 실수입니다.

둘 다 배우십시오! 또는 아마도 더 좋을 것입니다 : 먼저 스칼라와 같이 둘 다를 포함하는 언어를 배우십시오. 타이 다이 티셔츠와 약간의 네덜란드 악센트가 마음에 들지 않으면 MSDN에서 제공되는 Erik Meijer 박사FP 강의가 유용 할 것입니다.