나는 초보자부터 전문가까지, Haskell의 기술 수준에 따라이 가이드를 주문할 것입니다. 이 과정은 몇 개월 (수년?)이 걸리므로 시간이 오래 걸립니다.
완전 초보
첫째, Haskell은 충분한 기술을 가지고 무엇이든 할 수 있습니다. 그것은 매우 빠르며 (내 경험상 C 및 C ++에서만) 시뮬레이션에서 서버, GUI 및 웹 응용 프로그램에 이르기까지 모든 용도로 사용할 수 있습니다.
그러나 Haskell의 초보자에게는 다른 사람보다 쓰기가 더 쉬운 몇 가지 문제가 있습니다. 수학 문제와리스트 프로세스 프로그램은 가장 기본적인 Haskell 지식 만 있으면되기 때문에 이에 대한 좋은 후보입니다.
첫째, Haskell의 기본 사항을 배우는 데 도움이되는 유용한 안내서 는 행복한 학습 haskell 튜토리얼 이며 첫 6 장 에서는 haskell 을 배우십시오 . 이것들을 읽는 동안 아는 것과 관련된 간단한 문제를 해결하는 것이 좋습니다.
또 다른 두 개의 좋은 자원이된다 하스켈 먼저 원칙에서 프로그래밍 및 하스켈에서 프로그래밍 . 둘 다 각 장에 대한 연습이 제공되므로 지난 몇 페이지에서 배운 것과 일치하는 작은 간단한 문제가 있습니다.
시도 할 문제의 좋은 목록은 haskell 99 문제 페이지 입니다. 이것들은 매우 기본적으로 시작되며, 진행하면서 더 어려워집니다. 재귀 및 고차 함수 기술을 연습 할 수 있으므로 많은 것을 수행하는 것이 좋습니다. Haskell에서는 좀 더 어려우므로 임의성이 필요한 문제는 건너 뛰는 것이 좋습니다. QuickCheck를 사용하여 솔루션을 테스트하려는 경우이 SO 질문 을 확인하십시오 (아래 중급 참조).
그 중 몇 가지를 수행하면 Project Euler 문제 몇 가지로 넘어갈 수 있습니다. 이들은 얼마나 많은 사람들이 그들을 완료했는지에 따라 정렬되며, 이는 어려움을 상당히 잘 나타냅니다. 이것들은 당신의 논리와 Haskell을 이전의 문제보다 더 많이 테스트하지만, 여전히 처음 몇 가지를 할 수 있어야합니다. Haskell이 이러한 문제로 갖는 큰 장점은 정수의 크기가 제한되지 않는다는 것입니다. 이러한 문제 중 일부를 완료하려면 Haskell을 배우는 7 장과 8 장을 읽는 것이 좋습니다.
초보자
그런 다음 재귀 및 고차 함수를 상당히 잘 처리해야하므로 실제 문제를 좀 더 시작하는 것이 좋습니다. 시작하기에 좋은 곳은 Real World Haskell입니다 (온라인 서적, 하드 카피도 구입할 수 있습니다). 처음 몇 장에서 함수 프로그래밍 / 재귀 재귀를 한 적이없는 사람에게는 너무 빨리 소개되었습니다. 그러나 이전 문제를 수행했을 때의 연습으로 완벽하게 이해할 수 있습니다.
이 책의 문제를 해결하는 것은 Haskell에서 추상화를 관리하고 재사용 가능한 컴포넌트를 빌드하는 방법을 배우는 좋은 방법입니다. 일반적인 oo 추상화 방법 (oo 클래스)이 Haskell에 나타나지 않기 때문에 객체 지향 (oo) 프로그래밍에 익숙한 사람들에게 중요합니다 (Haskell에는 유형 클래스가 있지만 oo 인터페이스와 같이 oo 클래스와는 매우 다릅니다) ). 각 장은 이후 장에서 사용되는 많은 새로운 아이디어를 소개하므로 장을 건너 뛰는 것이 좋지 않다고 생각합니다.
잠시 후, 14 장으로 갈수록 두려운 모나드 장 (dum dum dummmm)이 나옵니다. Haskell을 배우는 거의 모든 사람들은 개념이 추상적이기 때문에 모나드를 이해하는 데 어려움을 겪고 있습니다. 모나드가 함수형 프로그래밍에있는 것처럼 추상적 인 다른 언어의 개념은 생각할 수 없습니다. Monads는 많은 아이디어 (IO 작업, 실패 할 수있는 계산, 파싱 등)를 하나의 아이디어로 통합 할 수 있도록합니다. 따라서 모나드 장을 읽은 후에 실제로 이해하지 못한다고 낙심하지 마십시오. 모나드에 대한 많은 다른 설명을 읽는 것이 유용하다는 것을 알았습니다. 각각은 문제에 대한 새로운 관점을 제시합니다. 다음은 모나드 튜토리얼 목록입니다 . 나는 Monads에 관한 모든 것을 강력히 추천 하지만, 다른 것도 좋습니다.
또한 개념이 진정으로 흡수되는 데 시간이 걸립니다. 이는 사용뿐만 아니라 시간이 지남에 따라 이루어집니다. 때때로 문제로 잠을 자면 다른 무엇보다 도움이된다는 것을 알게되었습니다! 결국, 아이디어가 클릭 될 것이고, 실제로 현실이 매우 단순하다는 개념을 이해하려고 애쓰는 이유를 궁금해 할 것입니다. 이런 일이 발생하면 대단하고, 그렇게 할 때 Haskell이 가장 좋아하는 명령형 프로그래밍 언어가 될 수 있습니다. :)
Haskell 타입 시스템을 완벽하게 이해하려면 20 개의 중간 haskell 연습 문제를 해결해야합니다 . 이러한 기능은 "furry"및 "banana"와 같은 재미있는 기능 이름을 사용하며 일부 기본 기능 프로그래밍 개념이없는 경우이를 잘 이해하는 데 도움이됩니다. 화살, 유니콘, 소시지 및 모피 바나나로 덮인 종이로 저녁을 보내는 좋은 방법.
중급
Monads를 이해하면 초보자 Haskell 프로그래머에서 중간 Haskeller로 전환했다고 생각합니다. 여기서 어디로 가야합니까? 내가 추천 할 첫 번째 것은 (모나드 학습에서 아직 배우지 않았다면) Reader, Writer 및 State와 같은 다양한 유형의 모나드입니다. 다시 한 번, 실제 세계 Haskell과 모나드에 관한 모든 것이 이것에 대해 잘 설명되어 있습니다. 모나드 변압기에 대한 모나드 교육을 완료하려면 필수입니다. 이를 통해 다양한 유형의 Monad (예 : Reader 및 State 모나드)를 하나로 결합 할 수 있습니다. 이것은 처음에는 쓸모없는 것처럼 보일지 모르지만, 잠시 동안 사용한 후에는 그들없이 어떻게 살았는지 궁금 할 것입니다.
원하는 경우 이제 실제 하스켈 책을 마칠 수 있습니다. 모나드를 두드리는 한 챕터를 건너 뛰는 것은 실제로 중요하지 않습니다. 관심있는 것을 선택하십시오.
당신이 지금 알고있는 지식으로, 당신은 하스켈과 함께 제공되는 대부분의 라이브러리뿐만 아니라 cabal (최소한 문서화 된 것들은 잘 ...)에서 대부분의 패키지를 사용할 수 있어야합니다. 시도해 볼만한 흥미로운 라이브러리 목록은 다음과 같습니다.
Parsec : 프로그램과 텍스트를 파싱합니다. 정규 표현식을 사용하는 것보다 훨씬 낫습니다. 훌륭한 문서, 실제 Haskell 장도 있습니다.
QuickCheck : 매우 멋진 테스트 프로그램입니다. 당신이하는 일은 항상 참이어야하는 술어를 작성하는 것입니다 (예 :) length (reverse lst) == length lst
. 그런 다음 술어에 QuickCheck를 전달하면 많은 무작위 값 (이 경우 목록)이 생성되고 모든 결과에 대해 술어가 참인지 테스트합니다. 온라인 설명서를 참조하십시오 .
HUnit : Haskell에서의 단위 테스트.
gtk2hs : Haskell의 가장 인기있는 GUI 프레임 워크로 Haskell에서 gtk 어플리케이션을 작성할 수 있습니다.
happstack : Haskell을위한 웹 개발 프레임 워크. 데이터베이스를 사용하지 않고 데이터 유형 저장소를 사용합니다. 꽤 좋은 문서 (다른 인기있는 프레임 워크는 snap and yesod 일 것입니다 ).
또한, 모나드 개념과 같은 많은 개념이 결국에는 배워야합니다. 뇌가 관련된 추상화 수준을 다루는 데 익숙해지기 때문에 이것은 Monas를 처음 배우는 것보다 쉽습니다. 이러한 높은 수준의 개념과 그 개념이 어떻게 조화를 이루는가에 대한 아주 좋은 개요는 Typeclassopedia 입니다.
적용 분야 : Monads와 같은 인터페이스이지만 성능이 떨어집니다. 모든 Monad는 적용 적이지만 그 반대는 아닙니다. 이것은 적용 적이지만 Monads가 아닌 유형이 있기 때문에 유용합니다. 또한, Applicative 함수를 사용하여 작성된 코드는 Monad 함수를 사용하여 동등한 코드를 작성하는 것보다 종종 작성 가능합니다. 하스켈 가이드 배우기에서 펑터, 응용 펑터 및 모노 이드 를 참조하십시오 .
Foldable , Traversable : 목록의 많은 작업을 추상화하여 다른 컨테이너 유형에 동일한 기능을 적용 할 수있는 유형 클래스입니다. 하스켈 위키 설명 도 참조하십시오 .
Monoid : Monoid는 0 (또는 비어있는) 값을 갖는 유형이며 <>
두 개의 Monoid를 함께 결합 하는 연산 ( 예 : x <> mempty = mempty <> x = x
및) x <> (y <> z) = (x <> y) <> z
입니다. 이를 정체성 및 연관성 법칙이라고합니다. 많은 종류의 등 번호와 같은 Monoids있다 mempty = 0
및 <> = +
. 이것은 많은 상황에서 유용합니다.
화살표 : 화살표는 입력을 받고 출력을 반환하는 계산을 나타내는 방법입니다. 함수는 가장 기본적인 화살표 유형이지만 다른 유형도 많이 있습니다. 라이브러리에는 화살표 조작을위한 매우 유용한 기능이 많이 있습니다. 일반 하스켈 함수와 함께 사용하더라도 매우 유용합니다.
배열 : Haskell의 다양한 가변 / 불변 배열.
ST Monad : 모나드 외부에 순수한 상태를 유지하면서 매우 빠르게 실행되는 가변 상태로 코드를 작성할 수 있습니다. 자세한 내용은 링크를 참조하십시오.
FRP : 기능적 반응 형 프로그래밍, 이벤트, 트리거, 입력 및 출력 (예 : GUI)을 처리하는 새로운 실험적 코드 작성 방법입니다. 나는 이것에 대해 많이 모른다. 얌파 에 대한 Paul Hudak의 이야기 는 좋은 출발입니다.
살펴 봐야 할 새로운 언어 기능이 많이 있습니다. 나는 그것들을 나열 할 것이다 .Google , haskell wikibook , haskellwiki.org 사이트 및 ghc documentation 에서 그들에 대한 많은 정보를 찾을 수있다 .
- 다중 매개 변수 유형 클래스 / 기능 종속성
- 타입 패밀리
- 기존 정량화 된 유형
- 팬텀 타입
- 가드
- 다른 사람 ...
많은 Haskell은 범주 이론을 기반으로 하므로 자세히 살펴볼 수 있습니다. 좋은 출발점은 컴퓨터 과학자를위한 범주 이론입니다 . 책을 사고 싶지 않다면 저자의 관련 기사 도 훌륭합니다.
마지막으로 다양한 Haskell 도구에 대해 더 배우고 싶을 것입니다. 여기에는 다음이 포함됩니다.
- ghc (및 모든 기능)
- cabal : Haskell 패키지 시스템
- darcs : Haskell로 작성된 분산 버전 제어 시스템으로 Haskell 프로그램에 매우 인기가 있습니다.
- haddock : Haskell 자동 문서 생성기
이러한 모든 새로운 라이브러리와 개념을 배우면서 Haskell에서 적당한 규모의 프로젝트를 작성하는 것이 매우 유용합니다. 작은 게임, 데이터 분석가, 웹 사이트, 컴파일러 등 무엇이든 가능합니다 . 이것으로 작업하면 현재 배우고있는 많은 것들을 적용 할 수 있습니다. 당신은 연령대에이 레벨을 유지합니다 (여기서는 내가있는 곳입니다).
전문가
이 단계에 도달하는 데 몇 년이 걸릴 것입니다 (2009 년부터 시작되었습니다!). 그러나 여기에서 박사 논문, 새로운 ghc 확장을 작성하고 새로운 추상화를 시작하는 것으로 추측합니다.
도움을 받다
마지막으로, 학습의 모든 단계에서 정보를 얻을 수있는 여러 곳이 있습니다. 이것들은:
- #haskell irc 채널
- 메일 링리스트 . 이들은 토론을 읽기 위해 가입 할 가치가 있습니다. 일부는 매우 흥미 롭습니다.
- haskell.org 홈페이지에 기재된 다른 장소
결론
글쎄, 이것은 내가 예상했던 것보다 길었다. 어쨌든, 나는 Haskell에 능숙 해지는 것이 매우 좋은 생각이라고 생각한다. 시간이 오래 걸리지 만 이는 주로 새로운 사고 방식을 배우고 있기 때문입니다. Java를 배우고 나서 Ruby를 배우는 것과 같지 않고 C를 배우고 나서 Java를 배우는 것과는 다릅니다. 또한 저는 아이디어를 추상화하는 많은 새로운 방법을 보면서 하스켈 학습의 결과로 객체 지향 프로그래밍 기술이 향상되었음을 알게되었습니다.