Haskell 이후에 배울 언어는 무엇입니까? [닫은]
첫 프로그래밍 언어로 하스켈을 배우기로 결심했습니다. 저는 분석 철학 전공자이며 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) 셋째, 프롤로그. 프롤로그에는 흥미로운 자료가 많이 있으며 기본 도메인은 제가 관심있는 도메인입니다. 간단한 구문을 가지고 있고 읽을 수 있습니다. 지금은 더 이상 언급 할 수 없지만 프롤로그의 개요를 읽고 순위 몇 가지 소개 자료를 훑어 본 후 (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에 대한 짧은 기사를 발표했습니다 .
강력한 유형의 프롤로그를 원한다면 Mercury 가 흥미로운 선택입니다. 나는 과거에 그것에 손을 대었고 그것이 내게 준 다른 관점을 좋아했습니다. 또한 유형 시스템에서 조정 성 (어떤 매개 변수가 자유 / 고정되어야 하는가) 및 결정 성 (결과가 몇 개입니까?)이 있습니다.
Clean 은 Haskell과 매우 유사하지만 모나드 (구체적으로는 IO 모나드)의 대안으로 사용되는 고유성 유형이 있습니다. 고유성 입력은 또한 배열 작업에 흥미로운 일을합니다.
조금 늦었지만 높은 수준의 추상화와 일반성에 대해 관심을 가질 수있는 몇 가지 패러다임과 관련 언어에 대해 언급 한 사람은 아무도 없다는 것을 알 수 있습니다.
- Maude또는ELAN과 같은 재 작성 시스템 ;
- 제약 처리 규칙 (CHR) .
큰 기준 (정적 * 타이핑) 중 하나를 충족하지 못했지만 Python에 대한 사례를 만들 것입니다. 당신이 그것을보아야한다고 생각하는 몇 가지 이유는 다음과 같습니다.
- 명령형 언어의 경우 놀랍게도 기능적입니다. 이것이 제가 그것을 배웠을 때 저를 놀라게 한 것 중 하나였습니다. 예를 들어 목록 이해력을 사용 하십시오 . 람다, 일류 함수 및 반복자 (맵, 접기, zip ...)에서 기능적으로 영감을받은 많은 구성이 있습니다. 문제에 가장 적합한 패러다임을 선택할 수있는 옵션을 제공합니다.
- IMHO, Haskell과 마찬가지로 코드를 작성하는 것이 아름답습니다. 구문은 간단하고 우아합니다.
- 그것은 효율성에 너무 세밀하게 초점을 맞추기보다는 일을 직접적으로하는 것에 초점을 맞춘 문화를 가지고 있습니다.
그래도 다른 것을 찾고 있다면 이해합니다. 예를 들어 논리 프로그래밍은 다른 사람들이 제안한 것처럼 골목길에 올 수 있습니다.
* 유형을 선언하고 싶기 때문에 여기서 정적 타이핑을 의미한다고 가정합니다. 기술적으로 Python 은 강력한 형식의 언어입니다. 예를 들어 문자열을 숫자로 임의로 해석 할 수 없기 때문입니다. 흥미롭게도 Boo 와 같은 정적 타이핑을 허용하는 Python 파생물이 있습니다.
Erlang을 추천합니다. 강력한 타이핑 언어가 아니므로 시도해보십시오. 프로그래밍에 대한 접근 방식이 매우 다르며 강력한 타이핑이 The Best Tool (TM)이 아닌 문제가 있음을 알 수 있습니다. 어쨌든 Erlang은 정적 유형 검증 (타자기, 투석기)을위한 도구를 제공하며 이점을 얻을 수있는 부분에 강력한 타이핑을 사용할 수 있습니다. 당신에게 흥미로운 경험이 될 수 있지만 준비가되어 있으면 매우 다른 느낌이 될 것입니다. "개념적으로 흥미로운 패러다임"을 찾고 있다면 Erlang, 메시지 전달, 공유 대신 메모리 분리, 배포, OTP, 오류 처리 및 오류 "예방"대신 오류 전파 등에서 찾을 수 있습니다. Erlang은 현재 경험과는 거리가 멀 수 있지만 C와 Haskell에 대한 경험이 있다면 여전히 두뇌가 간질입니다.
귀하의 설명이 주어지면 Ocaml 또는 F #을 제안 합니다.
ML 제품군은 일반적으로 강력한 유형 시스템 측면에서 매우 좋습니다. 패턴 매칭과 결합 된 재귀에 대한 강조도 분명합니다.
제가 조금 주저 하는 부분 은 배움 에 대한 보람 입니다. 그것들을 배우는 것은 의심 할 여지없이 저에게 보람이있었습니다. 그러나 제한 사항과 원하는 것에 대한 설명을 고려할 때 실제로 Haskell과 훨씬 다른 것을 찾고 있지 않은 것 같습니다.
제한을 두지 않았다면 Python 또는 Erlang 을 제안했을 것입니다 . 두 가지 모두 사용자의 안전 영역에서 벗어날 수 있습니다.
내 경험상 강력한 타이핑 + 재귀 강조는 또 다른 함수형 프로그래밍 언어를 의미합니다. 그런 다음 다시 말하지만 Haskell만큼 "순수한"사람은 없다는 점을 감안할 때 이것이 매우 보람있는 것인지 궁금합니다.
다른 포스터가 제안했듯이 Prolog와 Lisp / Scheme은 모두 동적으로 입력되지만 훌륭합니다. 특히 Scheme에 대한 강력한 이론적 "맛"을 가진 훌륭한 책이 많이 출판되었습니다. 많은 일반적인 컴퓨터 과학 지혜 (메타 순환 통역사 등)를 전달하는 SICP를 살펴보십시오 .
요인 은 좋은 선택이 될 것입니다.
Lisp 조사를 시작할 수 있습니다.
프롤로그도 멋진 언어입니다.
유형 시스템에 대한 선호도에서 벗어나기로 결정했다면 J 프로그래밍 언어에 관심이있을 것입니다. 기능 구성을 강조하는 방식이 뛰어납니다. Haskell에서 포인트없는 스타일을 좋아한다면 J의 암묵적인 형태가 보람이있을 것입니다. 특히 의미론과 관련하여 비정상적으로 생각을 자극하는 것을 발견했습니다.
사실, 그것은 당신이 원하는 것에 대한 당신의 선입견과 맞지 않지만 그것을 보여주십시오. 그것이 밖에 있다는 것을 아는 것만으로도 발견 할 가치가 있습니다. 완전한 구현의 유일한 소스는 J Software, jsoftware.com입니다.
메인 스트림 중 하나로 이동합니다. 사용 가능한 리소스, 기술의 미래 시장성, 풍부한 개발자 생태계를 고려할 때 Java 또는 C #으로 시작해야한다고 생각합니다 .
좋은 질문입니다. 저의 배경은 매우 다르지만 (유기 화학) 몇 달 동안 하스켈을 철저히 즐기면서 최근에 직접 질문했습니다.
당신과 마찬가지로 C와 그 ilk는 의문의 여지가 없습니다.
나는 오늘날 두 가지 실용적인 스크립팅 언어 (뮬스?)로서 Python과 Ruby 사이를 오가며 두 가지 모두 나를 행복하게 해줄 몇 가지 기능적 구성 요소를 가지고있다. 여기서 Rubyist / Pythonist 토론을 시작하지 않고이 질문에 대한 개인적인 실용적인 대답은 다음과 같습니다.
신청할 변명을 처음받는 사람 (Python 또는 Ruby)을 알아보세요.
참고 URL : https://stackoverflow.com/questions/3770774/what-language-to-learn-after-haskell
'IT' 카테고리의 다른 글
Java에서 null은 무엇입니까? (0) | 2020.09.15 |
---|---|
배열에서 가장 높은 키 / 보안 검색 (0) | 2020.09.15 |
튜플에서 JavaScript 변수 할당 (0) | 2020.09.15 |
UITableViewCell이하고있는 것처럼 보이게 무엇을해야합니까? (0) | 2020.09.15 |
scipy.misc 모듈에 imread 속성이 없습니까? (0) | 2020.09.15 |