Haskell 시작하기
며칠 동안 저는 Haskell의 함수형 프로그래밍 패러다임에 대해 머리를려고 노력했습니다. 튜토리얼을 읽고 스크린 캐스트를 수행이 작업을 수행했습니다. 이제 다양한 명령형 / OO 언어 (예 : C, Java, PHP)를 학습 할 때 연습이 좋은 방법을 학습합니다. 하지만 Haskell이 무엇을 할 수 있는지 잘 모르고 새로운 개념이 많기 때문에 어디서부터 시작할지 몰랐습니다.
그래서 어떻게 하스켈을 배웠습니까? 정말 "얼음 깨뜨리는"이유는 무엇입니까? 또한 운동을 시작하는 데 좋은 아이디어가 있습니까?
이 가이드를 하스켈에서 가지고있는 기술 수준에 따라 절대 주문할 것입니다. 이 프로세스는 수개월 (년?)이 걸리적 다소 길다는 점에 유의하십시오.
완전 초보
첫째, Haskell은 충분한 기술로 무엇이든 할 수 있습니다. 매우 빠르며 (내 경험상 C와 C ++ 만 뒤에서) 시뮬레이션에서 서버, GUI 및 웹 애플리케이션에 모든 것을 사용할 수 있습니다.
그러나 Haskell에서 다른 것보다 쉽게 몇 가지 문제가 있습니다. 수학적 문제와 목록 처리 프로그램은 쓰기를 할 수있는 가장 기본적인 기본적인 Haskell 지식 만 필요하기 때문에 이에 대한 좋은 후보입니다.
첫째, 하스켈의 매우 기초를 배우는 좋은 가이드가 되어 행복 하스켈 튜토리얼 와의 첫 6 장 당신에게 하스켈 내용 . 당신이 아는 간단한 문제를 해결하는 것도 아주 좋은 생각입니다.
또 다른 두 개의 좋은 자원이 하스켈에서 먼저 프로그래밍 및 하스켈에서 프로그래밍 . 둘 다 각 장에 대한 연습 문제가 있으므로 지난 몇 페이지에서 배운 것과 일치하는 작은 간단한 문제가 있습니다.
시도해 볼 수있는 좋은 문제 목록은 haskell 99 문제 페이지 입니다. 이것들은 매우 기본적인 설치 시작하여 계속 진행되고 따라 더 어려워집니다. 재귀 및 고차 함수에 대한 기술을 연습 할 수 있기 때문에 많은 작업을 수행하는 것이 좋습니다. Haskell에서는 좀 더 어렵 기 때문에 임의성이 필요한 문제는 건너 뛰는 것이 좋습니다. QuickCheck 솔루션을 테스트로하려는 경우이 SO 질문 을 확인하십시오 (아래 중급 참조).
그 중 몇 가지를 수행 한 후 몇 가지 프로젝트 오일러 문제 를 수행 할 수 있습니다. 이것들은 얼마나 많은 사람들이 그것을 완료했는지에 따라 분류되고, 이는 난이도를 상당히 잘 나타냅니다. 이것들은 이전 문제보다 훨씬 많은 테스트하지만, 처음 몇 개는 여전히 할 수 있습니다. Haskell이 큰 장점은 있지만 Integer는 크기에 제한이 있습니다. 비용 문제 중 일부를 완료 비용 7 장과 8 장을 읽고 하스켈도 배우는 것이 좋습니다.
그냥
그 후에는 재귀와 고차 함수에 대해 상당히 잘 다루어야하는 실제적인 실제 문제를 좀 더 해결하기 시작하는 것이 좋습니다. 시작하는 아주 좋은 곳은 Real World Haskell입니다 (온라인 책, 하드 카피도 구입할 수 있습니다). 이전에 함수형 프로그래밍 / 재귀를 소개 적이없는 사람에게 너무 빨리 발견했습니다. 그러나 이전 문제를 가지고 얻은 연습으로 완벽하게 수행 할 수 있습니다.
책의 문제를 해결하는 것은 Haskell에서 추상화를 관리하고 가능한 구성 요소를 구축하는 방법입니다. 이것은 프로그래밍에 익숙한 사람들에게 매우 중요합니다. 일반적인 oo 추상화 메서드 (oo 클래스)는 Haskell에 존재하므로 유형입니다 (Haskell 클래스가 oo 클래스와는 매우 많은 것입니다.). 각 장은 이후 장에서 사용되는 많은 새로운 아이디어를 소개하기 때문에 장을 건너 뛰는 것은 좋은 생각이 아니라고 생각합니다.
잠시 후 14 장, 두려운 모나드 장 (dum dum dummmm)에 도달하게됩니다. Haskell을 배우는 거의 모든 사람들은 개념이 매우 유명하므로 모나드를 이해하는 데 어려움을 겪습니다. 모나드가 함수형 프로그래밍 에서처럼 다른 언어의 개념을 생각할 수 없습니다. 모나드는 하나의 아이디어로 많은 아이디어 (예 : IO 작업, 실패 할 수있는 계산, 구문 분석 등)를 통합 할 수 있습니다. 따라서 모나드 챕터를 읽은 후 실제로 이해하지 못해도 낙심하지 않습니다. 모나드에 대한 다양한 설명을 읽는 것이 유용하다는 것을 알았습니다. 각각은 문제에 대한 새로운 관점을 제공합니다. 다음은 모나드 튜토리얼 의 아주 좋은 목록입니다 . 모나드의 모든 것 추천 하지만 다른 것도 좋습니다.
또한 개념이 진정으로 가라 앉는 데는 시간이 있습니다. 이 사용을 통해 지지만 시간이 지남에 따라 발생합니다. 나는 잠을자는 것이 무엇보다 더 도움이되는 것을 알게되었습니다! 결국 아이디어가 클릭되고, 믿을 수있는 간단한 개념을 이해하는 데 필요한 것입니다. 이런 일이 발생하면 굉장하고 그럴 때 Haskell이 가장 좋아하는 명령형 프로그래밍 언어가 될 수 있습니다. :)
하스켈 유형 시스템을 완벽하게 이해하고 확인한 결과 20 개의 중급 하스켈 연습 문제를 풀어야 합니다. "furry"및 "banana"와 같은 재미있는 함수 이름을 사용하는 기본적인 함수 프로그래밍 개념을 아직 가지고 있지 않은 경우 이해하는 데 도움이됩니다. 화살, 유니콘, 깔 복숭이 바나나로 덮힌 종이로 저녁을 깔 보는 방법입니다.
중급
모나드를 이해하고에서 초급 Haskell 프로그래머 중급 haskeller로 전환 한 것입니다. 그럼 여기서 어디로 가야할까요? 내가 추천하고 싶은 첫 번째 것은 (모나드를 배우지 않았다면) 독자, 작가 및 주와 같은 다양한 유형의 모나드입니다. 다시 말하지만, Real world Haskell과 모나드는 이것에 대해 큰 범위를 제공합니다. 모나드 교육을 완료하기 위해 모나드 변환기에 대해 배우는 것이 필수입니다. 이를 통해 다양한 유형의 모나드 (예 : 리더 및 상태 모나드)를 하나로 결합 할 수 있습니다. 처음에는 쓸모가 없어 보일 수 있습니다 잠시 사용하면 어떻게 살았는지 궁금 할 것입니다.
이제 원하는 경우 실제 Haskell 책을 끝낼 수 있습니다. 이제 챕터를 건너 뛰는 것은 실제로 사용하는 것이 모나드를 의미하지 않습니다. 관심있는 것을 선택하십시오.
당신이 지금 알고있는 지식으로, 당신은 하스켈과 함께 제공되는 대부분의 라이브러리가 아니라 cabal (적어도 문서화 된 것들)에서 대부분의 패키지를 사용할 수 있습니다. 시도 할 흥미로운 라이브러리 목록은 다음과 가변합니다.
Parsec : 프로그램 및 텍스트 구문 분석 용. 정규 사용하는 것보다 훨씬 낫습니다. 훌륭한 문서, 또한 실제 Haskell 장이 있습니다.
QuickCheck : 매우 멋진 테스트 프로그램입니다. 당신이하는 일은 항상 참이어야하는 술어를 작성하는 것입니다 (예 :)
length (reverse lst) == length lst
. 그런 다음 술어를 QuickCheck에 전달하면 많은 임의 값 (이 경우 목록)이 생성되고 술어가 모든 결과에 대해 참인지 테스트합니다. 온라인 설명서를 참조하십시오 .HUnit : Haskell의 단위 테스트.
gtk2hs : Haskell에서 가장 인기있는 GUI 프레임 워크로, Haskell에서 gtk 애플리케이션을 작성할 수 있습니다.
happstack : Haskell을위한 웹 개발 프레임 워크. 데이터베이스를 사용하지 않고 대신 데이터 형식 저장소를 사용합니다. 꽤 좋은 문서 (다른 인기있는 프레임 워크는 snap 및 yesod입니다 ).
또한 궁극적으로 배워야 할 많은 개념 (예 : Monad 개념)이 있습니다. 이것은 당신의 두뇌가 관련된 추상화 수준을 다루는 데 익숙해 질 것이기 때문에 모나드를 처음 배우는 것보다 쉬울 것입니다. 이러한 높은 수준의 개념에 대해 배우고 이들이 어떻게 결합되는지에 대한 아주 좋은 개요는 Typeclassopedia 입니다.
적용 적 : Monads와 같은 인터페이스이지만 덜 강력합니다. 모든 모나드는 적용 가능하지만 그 반대는 아닙니다. 적용 가능하지만 모나드가 아닌 일부 유형이 있으므로 유용합니다. 또한 Applicative 함수를 사용하여 작성된 코드는 종종 Monad 함수를 사용하여 동등한 코드를 작성하는 것보다 더 구성 가능합니다. 하스켈 가이드 학습에서 Functors, Applicative Functors 및 Monoids 를 참조하십시오 .
Foldable , Traversable : 목록의 많은 작업을 추상화하는 Typeclasses로 동일한 함수를 다른 컨테이너 유형에 적용 할 수 있습니다. haskell wiki 설명을 참조하십시오 .
모노 이드 하십시오 모노 이드가 0 (또는 mempty) 값을 갖는 유형 및 표기 동작 인
<>
두 개의 Monoids 조인되도록x <> mempty = mempty <> x = x
하고x <> (y <> z) = (x <> y) <> z
. 이를 신원 및 연관성 법칙이라고합니다. 많은 유형은 숫자와 같은 모노 이드이며mempty = 0
및<> = +
. 이것은 많은 상황에서 유용합니다.화살표 : 화살표는 입력을 받아 출력을 반환하는 계산을 나타내는 방법입니다. 함수는 가장 기본적인 화살표 유형이지만 다른 유형이 많이 있습니다. 라이브러리에는 화살표를 조작하는 데 매우 유용한 함수가 많이 있습니다. 이전의 평범한 Haskell 함수와 함께 사용하더라도 매우 유용합니다.
Arrays : Haskell의 다양한 가변 / 불변 배열.
ST Monad : 매우 빠르게 실행되는 변경 가능한 상태로 코드를 작성할 수 있지만 모나드 외부에서는 여전히 순수합니다. 자세한 내용은 링크를 참조하십시오.
FRP : Functional Reactive Programming, 이벤트, 트리거, 입력 및 출력 (예 : GUI)을 처리하는 코드를 작성하는 새롭고 실험적인 방법입니다. 나는 이것에 대해 많이 알지 못합니다. yampa 에 대한 Paul Hudak의 이야기 는 좋은 시작입니다.
살펴보아야 할 새로운 언어 기능이 많이 있습니다. 목록을 작성하겠습니다. Google, haskell wikibook , haskellwiki.org 사이트 및 ghc 문서 에서 많은 정보를 찾을 수 있습니다 .
- 다중 매개 변수 유형 클래스 / 기능적 종속성
- 유형 가족
- 실존 적으로 정량화 된 유형
- 팬텀 유형
- 개츠
- 기타 ...
많은 Haskell이 범주 이론을 기반으로 하므로이를 살펴보고 싶을 수 있습니다. 좋은 출발점은 컴퓨터 과학자를위한 범주 이론입니다 . 책을 사고 싶지 않다면 저자의 관련 기사 도 훌륭하다.
마지막으로 다양한 Haskell 도구에 대해 자세히 알아보고 싶을 것입니다. 여기에는 다음이 포함됩니다.
- ghc (및 모든 기능)
- cabal : Haskell 패키지 시스템
- darcs : Haskell로 작성된 분산 버전 제어 시스템으로, Haskell 프로그램에 매우 인기가 있습니다.
- haddock : Haskell 자동 문서 생성기
이러한 모든 새로운 라이브러리와 개념을 배우는 동안 Haskell에서 중간 크기의 프로젝트를 작성하는 것은 매우 유용합니다. 그것은 무엇이든 될 수 있습니다 (예 : 작은 게임, 데이터 분석기, 웹 사이트, 컴파일러 ). 이 작업을 수행하면 지금 배우고있는 많은 것을 적용 할 수 있습니다. 당신은 오랫동안이 수준에 머물러 있습니다 (제가있는 곳입니다).
전문가
이 단계에 도달하는 데는 몇 년이 걸리 겠지만 (2009 년부터 안녕하세요!), 여기서부터 박사 논문, 새로운 ghc 확장을 작성하고 새로운 추상화를 만들기 시작한다고 생각합니다.
도움을 받다
마지막으로, 학습의 모든 단계에서 정보를 얻을 수있는 여러 장소가 있습니다. 이것들은:
- #haskell irc 채널
- 메일 링리스트 . 토론 내용을 읽기 위해 가입 할 가치가 있습니다. 일부는 매우 흥미 롭습니다.
- haskell.org 홈페이지에 나열된 다른 장소
결론
예상했던 것보다 오래 되었네요 ... 어쨌든 하스켈에 능숙 해지는 것이 좋은 생각이라고 생각합니다. 시간이 오래 걸리지 만 주로 그렇게함으로써 완전히 새로운 사고 방식을 배우고 있기 때문입니다. 자바를 배운 후 루비를 배우는 것이 아니라 C를 배운 후 자바를 배우는 것과 같습니다. 또한 아이디어를 추상화하는 새로운 방법을 많이보고있는만큼 Haskell을 배운 결과 객체 지향 프로그래밍 기술이 향상되었음을 알게되었습니다.
제 동료 중 일부는 Learn You a Haskell for Great Good에 대해 좋은 경험을했습니다 ! .
명령형 프로그래밍 언어에 대한 경험이 있지만 이전에 기능적 언어로 프로그래밍 한 적이없는 사람들을 대상으로하는 자습서입니다.
온라인에서 읽을 수있는 좋은 책이 있습니다. Real World Haskell
내가 한 대부분의 Haskell 프로그램은 프로젝트 오일러 문제 를 해결하는 것이 었습니다 .
얼마 전에 제가 읽은 조언 중 하나는 (이론적으로) 해결하는 방법을 알고있는 단순한 문제의 표준 세트를 가지고 있어야한다는 것이 었습니다. 그리고 나서 새로운 언어를 배우려고 할 때마다 그 문제를 그 언어로 구현해야한다는 것입니다.
Haskell을 사용한 Functional Programming에 관한 13 개의 에피소드 시리즈를 재미있게 보았습니다.
C9 강의 : Erik Meijer 박사-함수형 프로그래밍 기초 : http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1/
다른 사람의 답변을 추가하려면 코딩 할 때 도움이되는 유용한 정보가 하나 있습니다 (예 : 프로젝트 오일러 문제 해결시) : Hoogle . 명령 줄 인터페이스 또는 웹 인터페이스를 사용할 수 있습니다 .
명령 줄
Haskell 플랫폼을 설치 한 후 다음을 확인하십시오. cabal install hoogle
Hoogle 사용 예 :
함수가 f x = 3 * x + 1
있고에 적용 (5 :: Int)
하고 결과와 해당 결과 등에 적용하고 해당 값의 무한 목록을 가져옵니다. 당신을 돕기위한 기능이 이미 존재한다고 생각할 수 있습니다 f
.
이 함수는 형식이 될 것 (a -> a) -> a -> [a]
걸리는 경우 f 5
또는 a -> (a -> a) -> [a]
이 걸리는 경우 5 f
(우리가 함수가 일반적인 유형입니다 가정하고 그냥 Int
S)
$ hoogle "a -> (a -> a) -> [a]"
Prelude iterate :: (a -> a) -> a -> [a]
네, 필요한 함수가 이미 존재하며 iterate
. 당신은 그것을 사용합니다 iterate func 5
!
웹 인터페이스
Graham Hutton의 Haskell 프로그래밍 은 간결하고 합리적으로 철저하며, Haskell을 가르친 그의 수년간은 실제로 보여줍니다. 어디에서 가던 지간에 거의 항상 사람들이 시작하는 것이 좋습니다.
특히, 8 장 ( "Functional Parsers")은 모나드를 다루는 데 필요한 실제 토대를 제공하며, 시작하기에 가장 좋은 곳이라고 생각 합니다. All About Monads . (하지만 그 장과 관련하여 웹 사이트의 정오표를 참고하십시오 do
. 특별한 도움 없이는 양식을 사용할 수 없습니다 . 먼저 유형 클래스에 대해 배우고 그 문제를 스스로 해결하는 것이 좋습니다.)
이것은 Haskell 초보자에게 거의 강조되지 않지만, 모나드를 사용하는 것뿐만 아니라 자신을 구성하는 것에 대해 상당히 일찍 배울 가치가 있습니다. 어렵지 않으며 사용자 지정 작업을 통해 여러 작업을보다 간단하게 만들 수 있습니다.
재미있는 은유로 모든 모나드 튜토리얼을 읽으려고하지 마십시오. 그들은 당신을 더 악화시킬 것입니다.
#haskell irc 채널에 가입하고 거기에서 질문 하는 것이 좋습니다 . 그렇게 하스켈을 배웠습니다. 위에서 제안한대로 Real World Haskell을 살펴보면 질문에 대한 실시간 답변이 크게 도움이 될 것입니다. #haskell의 많은 현명한 사람들은 재미와 이익을 위해 Haskell을 작성하므로 많은 좋은 정보를 얻을 수 있습니다. 시도 해봐!
내가 제일 좋아하는
Joeri van Eekelen, et al. | Wikibooks
Published in 2012, 597 pages
B. O'Sullivan, J. Goerzen, D. Stewart | OReilly Media, Inc.
Published in 2008, 710 pages
추가로 Yet Another Haskell Tutorial 을 소개로 추천 할 수 있습니다 .
저에게 많은 도움을 주었고 제가 볼 수있는 한 다른 답변에서 언급되지 않은 또 다른 좋은 학습 리소스 (아마 중급 수준)는 Brent Yorgey의 Typeclassopedia 이며 The Monad Reader (Issue 13)
매우 접근하기 쉬운 스타일로 작성되었으며 다음과 같은 입문 조언이 포함되어 있습니다.
전문 Haskell 해커의 지혜에는 두 가지 핵심이 있습니다.
유형을 이해하십시오.
각 유형 클래스 및 다른 유형 클래스와의 관계에 대한 깊은 직관을 얻으십시오. 이는 많은 예제에 대한 친숙 함으로 뒷받침됩니다.
Monad Reader 자체는 기능적 프로그래머 (하스켈 프로그래머뿐만 아니라)에게 절대적인 보물입니다.
쉬운 프로그램을 작성해보세요.
아마도 다양한 교과서에서 샘플 작업을 찾을 수 있습니다.
Haskell / FP 교과서에 집착하지 않는 것이 좋습니다. 계산, 문자열 조작, 파일 액세스와 같은 간단한 작업을 시도해보세요.
12 개를 풀고 나서 얼음을 깨뜨 렸습니다. :)
그 후 고급 개념 (Monads, Arrows, IO, 재귀 적 데이터 구조)에 대해 많이 읽으십시오. haskell은 무한하고 많이 있기 때문입니다.
저는 Haskell의 기능을 예제로 실현하는 것이 무엇보다도 시작하는 가장 좋은 방법이라고 생각합니다.
http://en.wikipedia.org/wiki/Haskell_98_features
모나드와 화살표를 포함한 까다로운 유형 클래스가 있습니다.
http://www.haskell.org/haskellwiki/Typeclassopedia
실제 문제와 더 큰 프로젝트의 경우 GHC (가장 많이 사용되는 컴파일러), Hackage (libraryDB), Cabal (빌딩 시스템), darcs (다른 빌드 시스템) 태그를 기억하십시오.
통합 시스템은 시간을 절약 할 수 있습니다 : http://hackage.haskell.org/platform/
이 시스템의 패키지 데이터베이스 : http://hackage.haskell.org/
GHC 컴파일러의 위키 : http://www.haskell.org/haskellwiki/GHC
Haskell_98_features 및 Typeclassopedia 후에는 이미 그들에 대한 문서를 찾고 읽을 수 있다고 생각합니다.
그건 그렇고, 앞으로 하스켈 표준의 일부가 될 GHC의 언어 확장을 테스트하고 싶을 수도 있습니다.
이것이 하스켈을 배우는 가장 좋은 방법입니다. 나는 그것이 당신을 도울 수 있기를 바랍니다.
먼저 BONUS의 튜토리얼 을 읽고 Real World Haskell (온라인 무료) 을 읽는 것이 좋습니다 . irc.freenode.com 에서 #Haskell IRC 채널에 가입하고 질문하십시오. 이 사람들은 완전히 초보자에게 친숙하고 시간이 지남에 따라 많은 도움을주었습니다. 또한, 바로 여기 SO는 당신이 이해할 수없는 것들에 대한 도움을받을 수있는 좋은 장소입니다! 낙심하지 마십시오. 일단 클릭하면 마음이 날아갈 것입니다.
BONUS의 튜토리얼은 당신을 준비시키고 Real World Haskell이 제공하는 스릴 넘치는 라이딩을 준비 할 것입니다. 행운을 빕니다!
명령형 / OO 언어에 대한 경험 만 있다면,보다 일반적인 기능적 언어를 디딤돌로 사용하는 것이 좋습니다. Haskell은 정말 다르며 어디서든 얻을 수있는 다양한 개념을 이해해야합니다. 먼저 ML 스타일 언어 (예 : F #)를 다루는 것이 좋습니다.
첫 번째 대답은 아주 좋은 것입니다. 전문가 수준에 도달하려면 일부 전문가와 함께 박사 학위를 받아야합니다.
Haskell 페이지 ( http://haskell.org) 를 방문하시기 바랍니다 . 거기에는 Haskell 커뮤니티에서 승인 한 Haskell의 최신 항목에 대한 많은 자료와 참조가 많이 있습니다.
참고 URL : https://stackoverflow.com/questions/1012573/getting-started-with-haskell
'ProgramingTip' 카테고리의 다른 글
Visual Studio에서 전체 디렉터리 구조를 "기존 항목 추가"어디에서 있습니까? (0) | 2020.09.29 |
---|---|
Node.js의 console.log ()에서 '[Object]'대신 전체 객체를 얻으려면 어떻게해야합니까? (0) | 2020.09.29 |
GitHub 리포지토리에 태그 만들기 (0) | 2020.09.29 |
하나 이상의 항목에 대한 유효성 검사에 실패했습니다. (0) | 2020.09.29 |
'이름'또는 'ID'로 HTML 앵커를 소유하고 있습니까? (0) | 2020.09.29 |