기능 프로그래밍 소개를위한 Scheme vs Haskell?


36

나는 C와 C #에서의 프로그래밍에 익숙하고 앞으로 C ++를 탐구 할 것이다. 함수형 프로그래밍을 다른 프로그래밍 패러다임으로 탐색하는 데 관심이있을 수 있습니다. 나는 이것을 재미있게하기 위해 노력하고 있으며, 직업에는 컴퓨터 프로그래밍이 필요하지 않으며, 대학의 컴퓨터 과학 과정에서 상당히 일찍 가르치는 기능적 프로그래밍의 사용에 다소 고무되어 있습니다. 람다 미적분학은 확실히 나의 수학 능력을 넘어서는 것이지만, 나는 함수형 프로그래밍을 다룰 수 있다고 생각합니다.

어떤 Haskell 또는 Scheme이 함수형 프로그래밍에 대한 좋은 소개 역할을합니까? emacs를 텍스트 편집기로 사용하고 있으며 앞으로 Emacs Lisp를 배우는 데 도움이 될보다 쉽게 ​​구성 할 수 있기를 원합니다. 그러나 내 이해는 Emacs Lisp는 Scheme과 상당히 다르며 기능과는 대조적으로 더 절차 적이라는 것입니다.

나는 Scheme을 추구하면 이미 구입 한 "The Little Schemer"책을 사용했을 것입니다 (제한된 잎에서 나는 약간 이상하다고 생각합니다). 또는 내가 Haskell을 추구한다면 "당신에게 큰 이익을위한 Haskell을 배우십시오"를 사용할 것입니다. 또한 채널 9에서 Erik Meijer 박사의 하스켈 소개 비디오를 볼 것입니다.

모든 제안, 피드백 또는 의견을 부탁드립니다.

감사.

PS BTW C # 개발에 사용하는 Visual Studio 2010이 있기 때문에 F #에도 액세스 할 수 있지만 언어 선택의 주요 기준이라고 생각하지 않습니다.


3
잊지 마세요Real World Haskell
대안

14
사소한 의견 : 람다 미적분학은 매우 간단한 시스템입니다. 멋진 점은 복잡하지 않다는 것이 아니라 그 반대입니다. 그런 간단한 시스템으로 원하는 모든 것을 표현할 수 있습니다. 프로그래밍 언어로 시작하십시오. 변수 참조, 함수 정의 및 함수 호출을 제외한 모든 것을 버립니다 . 짜잔! 람다 미적분학.


9
람다 미적분을 5 분 안에 가르 칠 수 있습니다. 이제 방금 배운 것의 결과를 이해하는 데 평생이 걸립니다. :)

5
나는 대담한 괄호가 많지 않기 때문에 주로 Scheme 대신 Haskell을 선택했습니다!
Joey Adams

답변:


27

OCaml을 추천합니다.

개인적 관점에서 볼 때, 현대적인 함수형 프로그래밍의 기본은 고차 함수, 정적 타입 시스템, 대수 데이터 타입 및 패턴 매칭입니다.

Scheme, ML과 Haskell 사이에서 ML이이 정의와 가장 관련이 있다고 생각하기 때문에 ML을 선택합니다. Scheme에는 정적 타이핑이 없지만 (Typed Racket이 있지만 스킴 초보자에게는 해당되지 않음) Haskell에는 너무 많은 다른 것들 (모나드, 게으른 평가 ...)이있어 흥미롭지 만 중요한 기초에서 관심을 돌릴 수 있습니다 .

SML과 OCaml도 똑같이 흥미 롭습니다. 나는 OCaml에 더 익숙해졌고, 더 "실제적인"느낌이 좋았습니다 (그러나 당신이 정말로 "실제"를 원한다면 당신의 영혼을 잃을 위험을 감수하고 싶다면 F #을 선택할 수도 있습니다).

Scheme과 Haskell도 매우 흥미로운 언어입니다. 매크로에 대한 스키마 강조는 흥미롭지 만 기능적 프로그래밍과 직접 관련이 없습니다 (논리 프로그래밍, 스택 기반 언어 및 기능 지향 E뿐만 아니라 확실히 시도해야 할 것들 중 하나입니다).

Haskell은 확실히 훌륭한 언어이며, 기능 프로그래밍 의 야심 찬 전문가들 에게는 필수 포인트라고 생각 합니다. 그러나 OCaml과 Haskell의 핵심 언어는 매우 유사하므로 (초보자를 혼란스럽게하는 게으른 평가는 제외) OCaml의 기본 사항을 알고 나면 Haskell을 쉽게 배울 수 있습니다. 또는 오히려 이상한 것들에 집중할 수 있으며 동시에 기본을 동화시킬 필요가 없습니다.

마찬가지로, OCaml과 Haskell을보고 더 많은 정보를 원한다면 Coq 또는 Agda를 살펴보십시오. 그러나 기능 프로그래밍에 대한 첫 번째 소개를 위해 Coq 또는 Agda를 추천하는 사람은 거의 없습니다 ...

요점을 명확하게 밝히기 위해 : 나는 OCaml (또는 SML)을 배우면 Haskell이 Haskell을 직접 배우는 것보다 더 쉽게 (또는 덜 고통스럽게) 배우는 것이 좋은 프로그래머가 될 것이라고 생각합니다.
게다가 OCaml과 Haskell은 이들을 차별화하는 좋은 점을 가지고 있으며, 둘 다 의 고급 기능에 대해 아는 것이 흥미 롭습니다 . Haskell을 배우는 것은 그 측면에서 좋지 않습니다 (물론 Haskell 이후 OCaml을 배울 수는 있지만 덜 논리적이며 더 좌절감을 줄 것입니다).

OCaml을 배우려면 Jason Hickey의 책 초안 (PDF)을 추천 합니다.

¹ 이 정의는 논쟁의 여지가있다. 일부 Scheme 사람들은 정적 타이핑은 함수형 프로그래밍과 관련이 없다고 주장합니다. 일부 하스켈 사람들은 순도에 대한 정의 ( "하스켈이하는 일이지만 더 이상은하지 않는 것")가 기능적 언어가되기위한 사인 조건 이 아니라고 주장 할 것입니다 . 동의하지 않습니다.


3
나를 OCaml로 안내해 주셔서 감사합니다. 그렇습니다. 저는 영혼을 위험에 빠뜨리고 F #을 탐험 할 것입니다. Linux, Mac OS X 및 Windows (주로 전자)를 위해 개발하지만 FSI는 이미 수행중인 세 가지 플랫폼 (Linux 및 Mac OS X에서 모노 실행) 모두에서 사용할 수있는 것으로 보입니다. Microsoft의 전체 무게가 기능적 프로그래밍 언어 ( "불완전한"언어 임에도 불구하고) 뒤에 있다는 사실은 기능적 프로그래밍 팬들에 의해 결정되는 것이 아니라 환영해야합니다.
haziz

SML은 죽은, OCaml로 쓰기 COQ에 존재
permeakra

1
ML의 경우 +1; 하스켈보다 더 분명합니다.
m3th0dman

또한 SML 또는 OCaml을 배우고 Haskell (+1)을 배우는 것이 좋습니다. 이러한 언어를 알고 나면 다른 언어 (예 : 스칼라)를 선택하는 것은 매우 쉽습니다. 또한 Scheme, Common Lisp 및 Clojure (이 순서대로)를 보면서 동적 언어에 대한 느낌을 가질 수 있습니다.
Giorgio

@haziz : 좋은 소프트웨어를 만들더라도 고객 잠금, 호환되지 않는 형식, 호환되지 않는 구현 등과 같은 관련된 모든 나쁜 관행이있는 Microsoft (또는 Oracle 등)는 독점으로 남아 있습니다.
Giorgio

26

함수형 프로그래밍의 고급 개념에 관심이 있다면 Haskell과 함께하십시오. 적절한 유형 시스템과 돌연변이에 대한 엄격한 금지가 있습니다. 그러나 Haskell은 희미한 마음을위한 것이 아닙니다.

기능적 디자인에 대한 소개를 원한다면 Scheme을 사용하십시오. 구문은 배우고 읽는 것이 훨씬 쉽습니다. 그것은 절차 적 프로그래밍을 허용하지만 !, 이름 끝에 어떤 절차도 사용하지 않도록 스스로 훈련하십시오 .

Scheme을 사용하면 프로그래밍 패러다임에 대한 최고의 소개 인 컴퓨터 프로그램구조 및 해석을 읽을 수 있습니다 . 이 책에는 MIT버클리 강의가 있습니다 .


4
"구문을 배우고 읽는 것이 훨씬 쉽다"는 매우 주관적입니다.

6
@luqui : 맞습니다. 아마도 '정규'는 더 나은 단어 일 것입니다. 백틱, 픽스, 우선 순위 또는 연관성 문제가 없습니다 --- 괄호, 많은 불필요하고 괄호입니다.
Hoa Long Tam

17

정답은 물론 둘 다입니다! 따라서 어떤 언어를 먼저 다루어야하는지에 대한 질문 일뿐입니다. 내 상황은 당신과 동일합니다. 나는 The Little Schemer를 엄청나게 즐겼습니다. 함수 프로그래밍의 기본 구성을 이해 한 후에는이를 이해해야합니다 (젤리 얼룩을 넣을 수있는 장소가 있습니다).

나는 당신에게 큰 이익을위한 하스켈을 배우기위한 분기에 관한 것입니다. 나는 그것도 꽤 즐기고 있지만 두 권의 책은 더 다를 수는 없습니다. Haskell은 특정 언어를 가르치는 매우 전통적인 접근 방식을 가지고 있습니다. Little Schemer는 Scheme과 관련이 있지만 Scheme의 언어가 아니라 함수형 프로그래밍의 기본 사항을 가르치는 데 훨씬 더 관심이 있습니다.

Little Schemer부터 시작하는 것이 좋습니다. 실용적이지는 않지만 더 근본적입니다.


17

함수형 프로그래밍에 관한 나의 두 센트는 특정 언어에 매달리지 않고 함수형 프로그래밍의 핵심 개념을 배우는 것입니다. 나는 상사가 APL에서 모든 개발을 요구하는 프로젝트에 먼저 참여함으로써 기능 프로그래밍을 배웠다. APL은 기능적인 배열 처리 언어이며 LISP, Haskell 또는 기타 주류 프로그래밍 언어와는 거리가 멀습니다. 진정한 보상은 일단 함수형 프로그래밍 패러다임을 "잡았다"고 문제를 함수형 프로그램으로 자동 마술로 분해하는 방법을 정신적으로 배웠다는 사실을 알게되었을 때, 더 이상 Haskell과 같은 다른 함수형 언어의 관용적 측면에 더 이상 위협받지 않았습니다. OCaml, Scheme, Scala 및 Clojure. 나는'

첫 번째 기능 언어를 선택하려면 Haskell 또는 Steel Bank Common Lisp (SBCL)를 선택했을 것입니다. Haskell의 경우 Learn You a Haskell ... , Real World Haskell , Haskell Road to Logic, Maths and Programming , Pearls of Functional Algorithm Design을 읽었습니다 . CL의 경우, Land of Lisp , 인공 지능 프로그래밍 패러다임 , (실제로 하드 코어 인 경우) Lambda를 읽습니다 . 실용적인 기능 프로그래밍 접근 방식과 개념에 대한 광범위한 개요를 얻기 위해 이러한 모든 책을 혼합하여 사용할 수 있습니다.

또한 Clojure와 Scala를 배우는 것도 고려할 것입니다. Clojure와 Scala는 독자적으로도 매우 훌륭하고 표현력이 뛰어난 기능 언어이므로 (FP 순수 주의자가 말한 내용에도 불구하고)


6

나는 "둘 다 배우다"는 점에 동의하지만 지금까지 언급되지 않은 몇 가지 점이 더 있습니다. 우선, 함수형 프로그래밍에 익숙하지 않고 Haskell을 사용하는 경우 FP 외에 몇 가지 새로운 문제에 직면해야합니다. 상당한 노력을 기울일 수있는 게으른 환경에서 사는 방법을 배워야합니다 C 또는 C #에서 사용하는 것과는 매우 다른 "실제"유형 시스템을 처리합니다.

Scheme, OTOH에는 외국어 구문이 있지만 배울 정적 유형 시스템이 없으며 엄격한 언어이므로 상황이 더 친숙합니다. 또한 Scheme 구현은 매우 가단성이 높은 경향이 있습니다. 예를 들어, Racket은이 를 극도로 취하고 지연 유형과 정적 유형을 제공합니다. 즉, "쉬운"항목으로 시작하여 기능적 언어 사용을 중단 할 수 있으며 나중에 자신을 키우고 유형이 지정된 변형 및 게으른 언어를 사용할 수 있습니다. 한 번에 하나의 기능을 처리하기 때문에 지금은 더 쉬워야합니다. 명확하게, 개념구문 문제가 사소하고 대부분 관련이 없을 정도로 충분히 새로워 질 것입니다. 다시 말해, 새로운 개념에 도달하면 구문이 사라질 정도로 바쁠 것입니다. (그리고 구문에 정말로 관심이 있다면, Haskell의 구문은 개인적으로 매우 우아하다고 생각되는 것입니다.

그러나 그 모든 것을 말하면 F #에도 좋은 점이 있다고 생각합니다. 여러분은 이것을 부수적 인 것으로 생각하지만 FP를 배우면 곧 모든 좋은 것을 사용하고 싶을 것입니다. F #을 사용하면 일상적인 업무에서 처리하는 것과 같은 종류의 문제를 쉽게 해결할 수 있으므로 더 많은 "실제"작업을 수행 할 수 있습니다. 이상적으로는 C #과 같이 그것을 사용하는 이점을보고 어떤 프로젝트에서 사용하는 지점에 도달하게됩니다. 따라서 액세스하기 쉽기 때문에 F # 만 선택하지 않는 것이 옳지 만 실제로 사용하는 것보다 더 좋은 것은 없기 때문에 고려해야합니다.이 새로운 개념. 반대로 Scheme 또는 Haskell을 사용하고 목적에 맞는 장난감 언어로 생각하면 (일부 사람들이 실제 응용 프로그램에 사용한다고 알고 있더라도) FP 전체를 너무 심각하게 받아들이지 않을 것입니다. [그러나 YMMV는 주로 주관적인 관찰을 기반으로하며 사람마다 크게 다를 수 있습니다.]


6

ML이 귀하의 옵션 중 하나가 아닌 이유가 있습니까? 책과 코스 유인물을 포함하여 상당히 많은 입문 자료가 있습니다. The Little Schemer를 좋아한다면 The Little MLer도 즐길 수 있습니다. 마지막으로 나중에 F #으로 쉽게 전환 할 수 있습니다. (나는 Haskell이나 Scheme을 두드리는 것이 아닙니다. 이상적으로 세 가지를 모두 배우십시오).

또한, Emacs Lisp에 관한 경고 문구. 나는 Haskell이나 ML이 당신을 준비시킬 것이라고 생각하지 않습니다. Scheme과 같은 Lispy 언어가 도움이 되겠지만 여전히 큰 차이점이 있습니다. 동적 범위 변수. 이맥스 확장 기능은 본질적으로 기능보다 더 중요한 경향이 있습니다. 그것들은 모두 편집기의 상태를 변경하는 것입니다.


ML / OCaml로 나를 안내해 주셔서 감사합니다. 예, "내 영혼을 위험에 빠뜨리고"F #을 탐색하겠습니다. Linux, Mac OS X 및 Windows (주로 전자)를 위해 개발하지만 FSI는 이미 수행중인 세 가지 플랫폼 (Linux 및 Mac OS X에서 모노 실행) 모두에서 사용할 수있는 것으로 보입니다. Microsoft의 전체 무게가 기능적 프로그래밍 언어 ( "불완전한"언어 임에도 불구하고) 뒤에 있다는 사실은 기능적 프로그래밍 팬들에 의해 결정되는 것이 아니라 환영해야합니다.
haziz

BTW 나는 아마존에서 The Little MLer를 주문했고 이미 그것을 받아 내 여행을 시작했습니다. 또한 학습 F #을 라이브러리에 추가했습니다. The Little MLer를 보충하기 위해 사용할 주류 교육 안내서 인 것 같습니다.
haziz

6

자신에게 48 시간 동안 방안 쓰기 (하스켈를)

나는 이것을 정말로 추천한다. 당신은 실제적이고 흥미로운 문제를 사용하여 Haskell을 배우게 될 것이며, 여러분이 구축 한 통역사와 함께 연주함으로써 최고의 구성표를 배울 것입니다. 이 길을 가면 Haskell 소개를 잘 유지하십시오. 해결해야 할 문제가 있으면 더 잘 이해할 것입니다.


필자는 실제로이 위키 / pdf를 사용하여 Haskell을 배우고 OCaml 기술을 익혔습니다 (관용적 Haskell을 OCaml로 번역). 누군가가이 자료를 가져 와서 여러 기능적 언어로 "포크"할 수 있다면 꽤 멋질 것입니다. 꽤 멋진 기능적 언어 사격의 기초가 될 수 있습니다!
Marc

1
이것의 주요 문제점은 모나드를 도입하지 않고 parsec을 도입한다는 것입니다.
대안

@alternative parsec에는 Monadic 인터페이스가 있지만 다른 많은 기능은 말할 것도없고 Applicative 인터페이스도 있습니다. 모나 딕 일반화 이전에 파섹을 소개하는 것은 이치에 맞지 않습니다
Philip JF

4

하스켈과 함께 갈 것입니다. 체계적으로, 절차 적 작업을 강요받을 수 있으며 유형 시스템이 Haskell 's만큼 도움이되지는 않습니다 . 초보자에게는 컴파일 시간에 코드가 올바른지 거의 확인하기 때문에 초보자에게 좋습니다 .


3
"코드가 올바른지 확인합니다"는 매우 잘못되었습니다. 어떤 타입 시스템도 그렇게 할 수 없습니다. (당신의 타입 시스템이 실제 정리 증명자가 아니라면)
Eli Barzilay

4
@Eli, Haskell을 사용해 보셨습니까? 이론적 으로이 진술은 분명히 거짓이지만 실제로는 적어도 내가 사용한 다른 모든 언어와 비교하여 꽤 정확하다는 것을 알았습니다. 즉, 나는 이것이 초보자에게 좋은 재산이라는 사실에 동의하지 않습니다. 내가 밧줄을 배우고있을 때 컴파일러가 잘못되었다고 소리 지르고 오류 메시지가 사용하는 어휘를 알지 못하는 경우 코드와 싸우지 않고 내 코드가 잘못 된 것을 구체적으로 보려고합니다.

1
@Eli "대부분"이 여기서 핵심 용어입니다. Haskell에서는 구현 방법에 대해 더 많은 시간을 투자하면 구현이 매우 쉽습니다. 그런 다음 입력하여지도, 접기 등이 제정신인지 확인하십시오.
대안

@Eli Barzilay : Haskell의 타입 시스템은 확실히 정리 증명 자에 가깝습니다. 그것은 이론적으로 입증자가 다른 도구보다 거의 흔하게 보이는 환경을 만들었습니다 . (내가 인과 관계를 암시하는 것은 아닙니다.)
greyfade

@luqui-예, 사용했습니다. 아닙니다. 실제와 이론 모두에서 여전히 잘못된 진술입니다. 그러나 Haskell만의 고유 한 것은 아닙니다.
Eli Barzilay

1

언어에 대한 토론에 쉽게 참여할 수 있다고 생각합니다. FP가 무엇인지 배우고 싶은 사람에게는 Ocaml / ML / Scheme / Haskell의 차이점이 배우기 위해 사용하는 자료 (책, 비디오, 도구)에 대한 편안함만큼 중요하지 않습니다. 특정 언어를 배우는 데 도움을 줄 친구가 있는지 여부는 다른 모든 것보다 우선합니다.


0

순수하지 않다면 명령형 언어를 사용할 수도 있습니다.


0

귀하의 질문에 대한 답변 중 하나 에서이 링크 는 Haskell과 Scheme의 맛을 제공하기 때문에 매우 흥미 롭습니다.

그 멋진 링크 외에도 여기에 귀하의 질문에 대한 답변이 있습니다.

명령형 프로그래밍 배경에서 온다면 함수형 프로그래밍을 배우는 데 많은 노력을 기울일 수 있습니다. 학습 경험이 비어 있지 않은지 확인합니다. 즉, 현재 또는 다음 직업에 적용하거나 다른 방식으로 도움을 줄 수 있습니다.

좋은 언어가 많이 있습니다. 스칼라 사람들은 Clojure와 CL 사람들처럼 그들의 언어를 칭찬했습니다. Pythonistas조차 게으름을 주장합니다. 귀하에게 답변 한 다른 사람들이 ML을 제안했습니다. 아 미트 토레 도는 하스켈을 배우는 것이 좋습니다 수있는 작업에 Clojure의를 썼다.

Windows와 F #을 언급했습니다. 현재 위치에서 도움이됩니까? 나는 F #에 대해 아무것도 모른다. 기능이 충분합니까? IMHO Python에는 기능적 구문이 있기 때문에 Clojure의 프로그래밍과는 다릅니다.

요약하면, "실제로"기능적이며 상황에 가장 적합한 기능적 언어를 배우십시오.


-2

상대적 초보자의 관점에서, 당신이 당신의 수학이 상당히 성숙하지 않은 한, Scheme을 결정한다면 SICP로 시작하지 않는 것이 좋습니다. 이 책과 비디오는 미묘한 것으로 채워져 있으며 처음에는 누군가에게 직관적이지 않습니다.

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