2012-07-13 2 views
6

나는 지평선을 넓히기 위해 기능적 언어를 배우고 싶다. 저는 파이썬과 C/C++에 대한 지식을 가지고 있으며, 언어의 필수 영역에서 오는 사람으로부터 언어를 배우기 쉽도록하고 싶습니다. 언어가 충분히 강력하다면 나는 상관하지 않습니다. 나는 함수형 프로그래밍의 기초를 배우기 위해 언어를 원한다. 그리고 나는 더 어렵고 강력한 언어를 시도 할 것이다.명령형 언어를 배경으로하는 사람에게 가장 쉬운 함수형 프로그래밍 언어는 무엇입니까?

감사

+3

하스켈은 순수한 기능 패러다임을 배우는 것이 좋습니다. 쉽지는 않지만 다른 언어 (스칼라 및 다른 언어)로 절차 적 및 기능적 패러다임을 혼합하여 혼란 스러울 수 있습니다. – MatijaSh

답변

8

나는 이러한 교육적 목적을위한 pure-lang 좋습니다. 그것은 또한 충분히 강력합니다. 좀 더 대중적인/커뮤니티 지원을 원한다면 Scheme이나 OCaml을 권하고 싶다. Scheme에 익숙하지 않은 문법 (Scheme)을 다루거나 OCaml에 익숙하지 않은 타이핑 (OCaml)을 먼저 다루 겠느냐에 따라 다르다. SML과 F #은 OCaml과 약간 다릅니다. 다른 사람들은 Clojure, Scala 및 Haskell을 언급했거나 언급 할 것입니다.

Clojure는 고유 한 특성 (예 : 꼬리 전화 최적화 없음)을 사용하여 Scheme의 변형이므로 Scheme으로 시작하는 방법입니다. 비록 당신이 덜 특이한 Scheme 구현으로 더 쉬운 시간을 가지길 기대합니다. Racket은 가르침을 위해 종종 사용됩니다. 스칼라는 OCaml과 근본적으로 유사하지만 캐주얼 친숙만을 기반으로합니다.

하스켈과는 달리 언급 된 다른 언어들은 모두 기본적으로 열심 인 평가 순서입니다. (1) 특별히 요청하여 게으른 평가를 얻을 수는 있습니다. 하스켈은 그 반대입니다. (2) 돌연변이는 가능하지만 많은 라이브러리와 코드는 사용하지 않습니다. 실제로 기능 프로그래밍을 배우는 동시에 교수가 부작용과 어떻게 상호 작용하는지, 그리고 모나 딕 스타일 구성으로 나아가는 길을 다소 길 아래에서 배우는 것이 교육학적인면에서 효과적이라고 생각합니다. 그래서 이것이 이점이라고 생각합니다. 어떤 사람들은 Haskell의 격리 된 mutaton 처리에 우선적으로 던져 넣는 것이 낫다는 것을 알려줄 것입니다.

CMU의 Robert Harper has some nice blog posts on teaching functional programming. 내가 아는 한, 그는 OCaml과 같은 언어를 가르치기를 좋아한다.

내가 추천 한 세 가지 언어 (Pure, Scheme 및 friends, OCaml 및 friends) 중에서 처음 두 언어는 동적 입력을 사용합니다. 첫 번째와 세 번째는 명시 적 참조 셀을가집니다 (파이썬에서는 변수를 재 할당하지 않더라도 목록 인덱스에 저장된 내용을 변경할 수 있습니다). 스키마에는 암시 적 참조 셀이 있습니다. C 및 Python 에서처럼 변수 자체가 바뀔 수 있으며 참조 셀 처리는 커버 아래에서 수행됩니다. 이와 같은 언어에서, 여러분은 종종 명시적인 참조 셀을 사용할 수 있습니다 (Python에서 방금 준 예제 또는 Racket에서 변경 가능한 쌍 /리스트 사용 ... Scheme 표준을 포함한 다른 Schemes에서 기본 쌍/목록).

하스켈의 장점 중 하나는 일부 교과서가 나타나는 것입니다. (나는이 말을 진지하게 중요하게 생각하지는 않는다.) 어떤 서적/자료를 사용해야하는지는 많은 전쟁/닫힌 질문에 대한 또 다른 논쟁적인 문제이다. SICP는 다른 사람들이 많은 팬들과 몇몇 비평가를 추천하도록 추천했습니다. 많은 좋은 선택이 될 것 같습니다. 나는 그 논쟁에 대해 더 이상 모험하지 않을 것이다.

1

이 질문은 끝이 언어 전쟁을 초래할 것입니다 때문에 아마 오프 주제이지만, 여기에 조언의 일반적인 비트 :

때때로 함수형 프로그래밍 언어의 클래스가 호출되는

"대부분 기능" , 당신이 원하는 곳에서 필수 기능을 허용한다는 점에서. 표준 ML, OCaml, F # 및 스칼라를 예로들 수 있습니다. 합리적으로 익숙한 방법으로 작업을 수행하면서 기능적 관용구 스타일을 파악할 수 있기를 원한다면이 중 하나를 고려해보십시오.

저는 과거에 표준 ML을 광범위하게 사용했지만, 학습 곡선이 약간 부족한 것을 찾고 있다면 필자는 두 번째로 좋아하는 프로그래밍 언어 인 스칼라를 개인적으로 추천 할 것입니다. 여기에는 도서관의 보급, 건강한 규모의 커뮤니티, 시작하는 데 도움이되는 멋진 서적 및 자습서가 있습니다 (특히 자바에 대해 어떤 거래를 했더라도).

+1

당신이 원할 때 명령형으로 대체 할 수있는 능력이 기능적 스타일을 배우는 데 장애가 될지 궁금합니다. – Thilo

+0

이 질문은 구체적으로 "배우기가 가장 쉽습니다"라는 질문을 했으므로 명령형 폴백이 최상의 장기 전략이 아닐 수도 있다는 점에 동의하지만 학습 곡선을 줄여 IO 작동 방법을 배울 필요가 없습니다 순수한 환경에서 다른 모든 것과 동시에 : – Gian

+0

그래, 나는이 질문이 곧 닫히기를 기대한다. – dubiousjim

4

처음에는 컴퓨터 프로그램의 구조와 구현을 읽으십시오. 필자는 첫 번째 함수형 프로그래밍 언어로서 Lisp (예를 들어, Dialect Scheme)을 추천한다.

+0

나는 당신의 제안에 동의합니다. 나는 SICP에서 많은 유익을 얻고 연습을하고있다.나는 또한 SICP를 강하게 추천 할 것이다. – weima

+0

아마도 책 이름은 _ 구조 및 컴퓨터 프로그램의 해석 _ – ibubi

2

또 다른 옵션은 Clojure입니다. Scheme/Racket보다 더 "순전히"기능적이며 (여기에서 세부 정보를 묻지 마십시오) SICP와 함께 사용할 수있는 정도로 유사합니다. (구조 및 컴퓨터 프로그램의 해석, 또 다른 대답에 의해 제안 된 추천 도서).

1

논의되지 않은 한 가지 요소는 하스켈, ML의 모든 맛, 언급 된 다른 언어와 같은 대수적 데이터 유형에 대한 특수 패턴 일치 구문의 사용 가능성입니다. 패턴 일치 구문은 프로그래머가 수학 함수의 기능을 수행하는 데 도움이됩니다. 하스켈의 구문은 충분히 복잡하고, 구문 분석은 하스켈을 선택하지 않는 적절한 이유이다. Scheme은 대부분의 다른 옵션보다 배우기 쉽지만 (Scheme은 모든 매크로 시스템의 왕을 갖고있을 것입니다), 패턴 매칭 구문이 없기 때문에 함수 프로그래밍에 대한 소개를 위해 구문 매칭 구문이 부족합니다.

+1

학습 기능 프로그래밍에서 패턴 일치의 중요성에 대해 완전히 동의합니다. 나는 대부분의 또는 모든 선택에 대해 다소간의 작업을 통해 이용 가능할 것이라고 생각합니다. 많은 Scheme 구현은 최소한 확장으로 패턴 매칭을한다; 라켓은 기본적으로 가지고 있습니다. 구현에 의존하지 않는 버전은 교재 Essentials of Programming Languages와 함께 배포됩니다. 반드시 Scheme으로 FP를 배우는 누군가는 반드시 이러한 시설을 이용해야합니다. – dubiousjim

+1

내 생각에 라켓의 패턴 일치 구문은 ML에서 구문을 수행하는 구문보다 훨씬 쉽게 읽고 쓸 수 있습니다. 내가 혼란 스럽습니까? Racket이 대수 데이터 타입을 가지고 있지 않다는 사실은 PLAI 서브 언어가 그들을 위조하는 훌륭한 일을하지만 문제를 악화시킵니다. – dfeuer

+0

@dfeuer Lisp과 OCaml 사이에서 선택했을 때 Lisp 커뮤니티와 길이면 설명했습니다. Lispers는 Lisps가 대수 데이터 유형을 가지고 있지 않을 수도 있다고 대답하지만 완전한 통일을 할 수 있기 때문에 더 강력한 자체 패턴 일치 라이브러리를 작성할 수있는 매크로가 있습니다. 그러나 OCaml, F #, Haskell, Scala에서는 패턴 매칭이 유비쿼터스이지만 Lisp, Scheme, Racket, Clojure에서는 통일이 거의 전례가 없다. 그래서 나는 Lispers가 그것을 잃어 버렸다고 말하는 것이 공평하다고 생각합니다. 패턴 매칭은 MLs가 Lisps보다 훨씬 뛰어납니다. –

2

나는 지평선을 넓히기 위해 기능적 언어를 배우고 싶다. 저는 파이썬과 C/C++에 대한 지식을 가지고 있으며, 언어의 필수 영역에서 오는 사람으로부터 언어를 배우기 쉽도록하고 싶습니다. 언어가 충분히 강력하다면 나는 상관하지 않습니다. 나는 함수형 프로그래밍의 기초를 배우기 위해 언어를 원한다. 그리고 나는 더 어렵고 강력한 언어를 시도 할 것이다.

큰 질문!

저는 1990 년대 후반에 함수형 프로그래밍을하기 전에 BASIC, Pascal, C, C++을했습니다. 그런 다음 거의 동시에 Mathematica와 OCaml에서 두 가지 기능 언어를 사용하기 시작했으며 몇 년 안에 독점적으로 사용했습니다. 특히, OCaml은 내가 전에 작성한 코드처럼 보이는 명령형 코드를 작성하게했다. ML의 이점을 분명히 한 여러 가지 접근법을 비교할 수 있기 때문에 학습자로서의 가치가 있음을 알게되었습니다.

그러나 다른 사람들이 언급했듯이 Mathematica와 OCaml의 핵심 이점은 패턴 일치이며 기술적 프로그래밍과 기술적으로 관련이 없습니다. 이후에 많은 다른 기능 언어를 살펴 보았지만 패턴 일치가없는 언어로 돌아가고 싶지는 않습니다.

관련 문제