첫 번째 프로그래밍 언어로 하스켈을 배우기로 결심했습니다. 저는 분석 철학 전공자이며 Haskell을 통해 자연어 구문 분석을위한 변환기, 정리 검증 자 및 해석기와 같은 관심 프로그램을 빠르고 정확하게 만들 수있었습니다. 2 개월 반 동안 프로그래밍을 해왔지만 Haskell의 의미와 구문은 기존의 명령형 언어보다 배우기가 훨씬 쉬웠으며 대부분의 구성에 익숙해졌습니다.
그러나 Haskell에서의 프로그래밍은 마법과 같으며 프로그래밍에 대한 지식을 넓히고 싶습니다. 배울 새로운 프로그래밍 언어를 선택하고 싶지만, 임의의 언어를 선택하고 삭제하고 반복 할 시간이 충분하지 않습니다. 그래서 저는 제가 찾고있는 언어 유형에 대한 몇 가지 규정과 함께 여기에 질문을 제기 할 것이라고 생각했습니다. 일부는 주관적이며 일부는 Haskell에서 쉽게 전환하기위한 것입니다.
- 강력한 유형 시스템. Haskell에서 프로그래밍에서 가장 좋아하는 부분 중 하나는 유형 선언을 작성하는 것입니다. 이것은 개별 기능 및 프로그램 전체와의 관계에 대한 나의 생각을 구조화하는 데 도움이됩니다. 또한 내 프로그램의 정확성에 대해 비공식적으로 추론하는 것이 더 쉽습니다. 저는 효율성이 아니라 정확성에 관심이 있습니다.
- 반복보다는 재귀에 중점을 둡니다. Haskell에서 반복 구조를 사용하지만 재귀 적으로 구현합니다. 그러나 복잡한 반복 절차보다 재귀 함수의 구조를 이해하는 것이 훨씬 더 쉽습니다. 특히 결합 자 및 맵, 접기 및 바인딩과 같은 고차 함수를 사용할 때 더욱 그렇습니다.
- 배움에 대한 보람. Haskell은 작업하기에 보람있는 언어입니다. Kant를 읽는 것과 약간 비슷합니다. 그러나 몇 년 전 C에 대한 나의 경험은 그렇지 않았습니다. 나는 C를 찾는 것이 아닙니다. 언어는 개념적으로 흥미로운 패러다임을 강요해야합니다. 제 전적으로 주관적인 견해로는 C-likes는 그렇지 않습니다.
답변 무게 측정 : 물론 이것은 단지 메모 일뿐입니다. 잘 정돈 된 답변을 해주신 모든 분들께 답장을 드리고 싶습니다. 당신은 매우 도움이되었습니다.
1) 여러 응답에 따르면 재귀를 강조하는 강력하고 정적으로 입력 된 언어는 또 다른 기능적 언어를 의미합니다. Haskell과 계속해서 강력하게 작업하고 싶지만 camccann과 larsmans는 다른 언어가 “전환을 너무 쉽게 할 것”이라고 정확하게 지적했습니다. Caml에서 Haskell을 작성할 생각이 아니기 때문에 이러한 의견은 매우 도움이되었습니다! 증명 보조자 중에서 Coq와 Agda는 모두 흥미로워 보입니다. 특히 Coq는 구성 논리와 형식 이론에 대한 확실한 소개를 제공 할 것입니다. 1 차 술어와 모달 논리 (Mendellsohn, Enderton, Hinman의 일부)에 대해 약간의 시간을 보냈으므로 Coq를 많이 사용했을 것입니다.
2) 다른 사람들은 Lisp (Common Lisp, Scheme 및 Clojure)를 매우 선호했습니다. 내가 모은 것에서 Common Lisp와 Scheme은 모두 훌륭한 입문 자료를 가지고 있습니다 ( On Lisp 및 The Reasoned Schemer , SICP ). SICP 의 자료로 인해 Scheme에 의지하게됩니다. 특히 SICP를 통한 Scheme 은 다른 평가 전략, 게으름의 구현 및 연속, 해석기, 기호 계산 등과 같은 주제에 집중할 수있는 기회를 다룹니다. 마지막으로 다른 사람들이 지적했듯이 Lisp의 코드 / 데이터 처리는 완전히 새로운 것입니다. 따라서 나는 옵션 (2), Lisp에 크게 기울고 있습니다.
3) 셋째, 프롤로그. 프롤로그에는 흥미로운 자료가 많이 있으며 기본 도메인은 제가 관심있는 도메인입니다. 간단한 구문을 가지고 있으며 읽기 쉽습니다. 지금은 더 많은 설명을 할 수 없지만 Prolog의 개요를 읽고 몇 가지 소개 자료를 훑어 본 후 (2)로 순위가 매겨집니다. 그리고 Prolog의 역 추적은 항상 Haskell에 해킹당하는 것 같습니다!
4) 주류 언어 중에서 Python이 가장 흥미로워 보입니다. Tim Yates는 언어가 매우 매력적으로 들립니다. 분명히 파이썬은 종종 1 학년 CS 전공자들에게 가르칩니다. 개념적으로 풍부하거나 배우기 쉽습니다. 더 많은 조사를해야 할 것 같습니다.
추천 해주셔서 감사합니다! Lisp (Scheme, Clojure), Prolog 또는 Coq 또는 Agda와 같은 증명 보조가 권장되는 주요 언어 인 것처럼 보입니다.
답변
프로그래밍 지식을 넓히고 싶습니다. (…) 저는 제가 찾고있는 언어 유형에 대한 몇 가지 규정과 함께 여기에 질문을 제기 할 것이라고 생각했습니다. 일부는 주관적이며 일부는 Haskell에서 쉽게 전환하기위한 것입니다.
강력한 유형 시스템. (…) 또한 내 프로그램의 정확성에 대해 비공식적으로 추론하는 것이 더 쉽습니다. 저는 효율성이 아니라 정확성에 관심이 있습니다.
반복보다는 재귀에 중점을 둡니다. (…)
여기에서 전환을 너무 많이 완화 할 수 있습니다. 두렵습니다. 매우 엄격한 유형 시스템과 순전히 기능적인 스타일은 Haskell의 특징이며 주류 프로그래밍 언어와 유사한 거의 모든 것이 적어도 이들 중 하나를 손상시켜야합니다. 따라서이를 염두에두고 Haskell에 대해 좋아하는 것 같은 대부분 을 유지하기위한 몇 가지 광범위한 제안이 있지만 약간의 변화가 있습니다.
-
실용성을 무시하고 “Haskell보다 Haskell”을 선택하십시오 . Haskell의 유형 시스템은 비 종결 및 기타 지저분한 타협으로 인해 구멍이 가득합니다. 엉망진창을 정리하고 더 강력한 기능을 추가하면 Coq 및 Agda 와 같은 언어를 얻을 수 있습니다 . 여기서 함수 유형에는 정확성에 대한 증거가 포함됩니다 (함수 화살표
->
를 논리적 의미로 읽을 수도 있습니다 !). 이러한 언어는 수학적 증명 및 정확성 요구 사항이 매우 높은 프로그램에 사용되었습니다. Coq은 아마도 스타일에서 가장 눈에 띄는 언어 일 것입니다. 그러나 Agda는 Haskell과 같은 느낌을 가지고 있습니다 (또한 Haskell 자체로 작성 됨). -
유형을 무시하고 더 많은 마법을 추가하십시오 : Haskell이 마법이라면 Lisp 는 원시적이고 원시적 인 창조 마법입니다. Lisp 계열 언어 ( Scheme 및 Clojure 포함 )는 극도의 미니멀리즘과 결합 된 거의 비교할 수없는 유연성을 제공합니다. 언어에는 본질적으로 구문이 없으므로 트리 데이터 구조의 형태로 직접 코드를 작성합니다. Lisp에서 메타 프로그래밍은 일부 언어에서 비 메타 프로그래밍보다 쉽습니다.
-
조금을 손상시키고 가까이 주류로 이동 : 하스켈 당신은 아마없이으로 이동시킬 수있는있는 ML에 의해 크게 영향을 언어의 폭 넓은 제품군에 속하는 너무 많은 어려움. Haskell은 기능적 스타일의 유형 및 사용에 대한 정확성 보장과 관련하여 가장 엄격한 것 중 하나이며, 다른 사람들은 종종 하이브리드 스타일이거나 다양한 이유로 실용적인 타협을합니다. OOP에 대한 노출과 JVM의 Scala 또는 F #의 많은 주류 기술 플랫폼에 대한 액세스를 원하는 경우.NET에서는 Haskell과 많은 공통점이 있으며 Java 및 .NET 플랫폼과의 쉬운 상호 운용성을 제공합니다. F #은 Microsoft에서 직접 지원하지만 Haskell과 비교하여 비 Windows 플랫폼의 이식성 문제와 비교하여 성가신 제한이 있습니다. Scala는 Haskell의 유형 시스템 및 Java의 크로스 플랫폼 잠재력에 대한 직접적인 대응을 가지고 있지만 더 무거운 구문을 가지고 있으며 F #이 즐기는 강력한 자사 지원이 부족합니다.
이러한 권장 사항의 대부분은 다른 답변에도 언급되어 있지만 이에 대한 나의 근거가 약간의 깨달음을 제공하기를 바랍니다.
답변
나는 그 가이가되어 잘못된 것을 요구하고 있다고 제안 할 것입니다.
먼저 당신은 당신의 시야를 넓히고 싶다고 말합니다. 그런 다음 원하는 언어의 종류를 설명하면 그 지평이 이미 가지고있는 지평처럼 들립니다. 똑같은 것을 계속해서 배워도 많은 것을 얻을 수는 없습니다.
Lisp, 즉 Common Lisp, Scheme / Racket 또는 Clojure를 배우는 것이 좋습니다. 기본적으로 모두 동적으로 입력되지만 일종의 유형 힌트 또는 선택적 정적 입력 기능이 있습니다. 라켓과 클로저는 아마도 최선의 선택 일 것입니다.
Clojure 는 기본적으로 불변성과 많은 지연 평가와 같은 더 많은 Haskellism을 가지고 있지만 Java Virtual Machine을 기반으로합니다. 이는 약간의 이상한 사마귀가 있음을 의미합니다 (예 : JVM은 꼬리 호출 제거를 지원하지 않으므로 재귀가 친절합니다. 해킹).
Racket 은 훨씬 오래되었지만 정적 유형 지원 및 함수 프로그래밍에 중점을 두는 등 그 과정에서 많은 힘을 얻었습니다. 아마도 라켓을 최대한 활용하실 것 같습니다.
Lisps의 매크로 시스템은 다른 곳에서 볼 수있는 것보다 매우 흥미롭고 훨씬 강력합니다. 그것만으로도 적어도 볼 가치가 있습니다.
답변
전공에 맞는 관점에서 볼 때 명백한 선택은 Prolog 또는 그 파생어와 같은 논리 언어처럼 보입니다. 논리 프로그래밍은 기능적 언어 (예 : The Reasoned Schemer 참조)에서 매우 깔끔하게 수행 할 수 있지만 논리 패러다임으로 직접 작업하는 것을 즐길 수 있습니다.
twelf 또는 coq와 같은 대화 형 정리 증명 시스템도 당신의 환상을 불러 일으킬 수 있습니다.
답변
Haskell 프로그래머가 편안하게 느낄 수있는 구문을 가진 강력한 증명 보조 도구 인 Coq 를 배우는 것이 좋습니다. Coq의 멋진 점은 Haskell을 포함한 다른 기능 언어로 추출 할 수 있다는 것입니다. Hackage 에 Coq로 작성된 패키지 ( Meldable-Heap )도 있으며 작동에 대한 속성이 입증 된 후 Haskell로 추출되었습니다.
Haskell보다 더 많은 힘을 제공하는 또 다른 인기있는 언어는 Agda입니다 . 저는 Agda가 Hackage에 의존적으로 타이핑되어 있고 제가 존경하는 사람들에게 잘 존경 받는다는 사실을 넘어서는 잘 모릅니다.
나는 이것들 중 어느 것도 쉽지 않을 것이라고 생각합니다. 그러나 Haskell 을 알고 있고 Haskell 유형 시스템보다 더 많은 힘을주는 언어로 나아가고 싶다면 그것들을 고려해야합니다.
답변
주관적인 관심사 외에 제한 사항을 언급하지 않았고 ‘배움에 대한 보상’을 강조 했으므로 (정적 인 타이핑 제한은 무시하겠습니다), 패러다임이 다른 몇 가지 언어를 배우는 것이 좋습니다. 각각의 ‘모범’입니다.
- 리스프의 코드로서의 데이터 / homoiconicity 일에 대한 그들이 최고의 아니라면, 동적의 예 (다소 엄격) 함수형 프로그래밍 언어 좋은 때문에 방언
- 지배적 인 논리 프로그래밍 언어로서의 프롤로그
- 하나의 진정한 OOP 언어로서의 스몰 토크 (일반적으로 이미지 중심적인 접근 방식 때문에 흥미 롭습니다)
- 어쩌면 얼랑 또는 Clojure의 당신은 동시 / 병렬 / 분산 프로그래밍을위한 위조 언어에 관심이 있다면
- 넷째 스택 지향 프로그래밍에 대한
- ( 엄격한 기능적 정적으로 형식화 된 지연 프로그래밍을위한 Haskell )
특히 Lisps (스킴만큼 CL이 아님)와 Prolog (및 Haskell)는 재귀를 수용합니다.
제가이 언어의 전문가는 아니지만 Erlang과 Forth를 제외하고 각각의 언어에 대해 어느 정도 시간을 보냈고, 각 언어가 다른 각도에서 문제 해결에 접근함에 따라 모두 눈을 뜨고 흥미로운 학습 경험을 제공했습니다. .
그래서 내가 몇 가지 언어를 시도 할 시간이 없다는 부분을 무시한 것처럼 보일 수 있지만, 나는 이들 중 어느 것에도 시간을 낭비하지 않을 것이라고 생각하며, 모두 살펴보아야합니다.
답변
방법에 대한 스택 지향 프로그래밍 언어 ? 고양이 는 당신의 최고점을 친다. 그것은:
- 유형 추론을 사용하여 정적으로 입력합니다.
- 반복과 같은 일반적인 명령형 언어 개념을 다시 생각하게합니다. 조건부 실행 및 루핑은 결합 자로 처리됩니다 .
- 보상-또 다른 계산 모델을 이해하도록합니다. 문제를 생각하고 분해하는 또 다른 방법을 제공합니다.
Dobbs 박사 는 언어가 약간 변경되었지만 2008 년에 Cat에 대한 짧은 기사를 발표했습니다 .