Tôi sẽ đặt hàng hướng dẫn này theo cấp độ kỹ năng bạn có trong Haskell, từ một người mới bắt đầu tuyệt đối cho đến một chuyên gia. Lưu ý rằng quá trình này sẽ mất nhiều tháng (năm?), Vì vậy nó khá dài.
Người mới bắt đầu tuyệt đối
Thứ nhất, Haskell có khả năng làm bất cứ điều gì, với đủ kỹ năng. Nó rất nhanh (chỉ sau C và C ++ theo kinh nghiệm của tôi) và có thể được sử dụng cho mọi thứ từ mô phỏng đến máy chủ, guis và ứng dụng web.
Tuy nhiên, có một số vấn đề dễ viết hơn cho người mới bắt đầu ở Haskell so với những người khác. Các vấn đề toán học và các chương trình xử lý danh sách là những ứng cử viên tốt cho việc này, vì chúng chỉ đòi hỏi kiến thức cơ bản nhất của Haskell để có thể viết.
Đầu tiên, một số hướng dẫn tốt để học những điều cơ bản của Haskell là hướng dẫn học haskell vui vẻ và 6 chương đầu tiên để tìm hiểu về bạn một haskell . Trong khi đọc những điều này, một ý tưởng rất tốt là cũng giải quyết các vấn đề đơn giản với những gì bạn biết.
Hai tài nguyên tốt khác là Lập trình Haskell từ các nguyên tắc đầu tiên và Lập trình trong Haskell . Cả hai đều đi kèm với các bài tập cho mỗi chương, vì vậy bạn có những vấn đề nhỏ đơn giản phù hợp với những gì bạn đã học trên một vài trang cuối.
Một danh sách tốt các vấn đề cần thử là trang 99 vấn đề haskell . Những điều này bắt đầu rất cơ bản, và trở nên khó khăn hơn khi bạn tiếp tục. Đó là thực hành rất tốt khi thực hiện rất nhiều trong số đó, vì chúng cho phép bạn thực hành các kỹ năng của mình trong đệ quy và các hàm bậc cao hơn. Tôi sẽ khuyên bạn bỏ qua mọi vấn đề đòi hỏi sự ngẫu nhiên vì điều đó khó hơn một chút trong Haskell. Kiểm tra câu hỏi SO này trong trường hợp bạn muốn kiểm tra các giải pháp của mình với QuickCheck (xem Trung cấp bên dưới).
Khi bạn đã thực hiện một vài trong số đó, bạn có thể chuyển sang thực hiện một vài vấn đề của Project Euler . Chúng được sắp xếp theo số lượng người đã hoàn thành chúng, đây là một dấu hiệu khá khó khăn. Chúng kiểm tra logic và Haskell của bạn nhiều hơn các vấn đề trước đó, nhưng bạn vẫn có thể thực hiện vài thao tác đầu tiên. Một lợi thế lớn mà Haskell có với những vấn đề này là Integers không bị giới hạn về kích thước. Để hoàn thành một số vấn đề này, sẽ rất hữu ích khi đọc các chương 7 và 8 để tìm hiểu về bạn một Haskell.
Người bắt đầu
Sau đó, bạn nên có một xử lý khá tốt về đệ quy và các hàm bậc cao hơn, vì vậy đây sẽ là thời điểm tốt để bắt đầu thực hiện một số vấn đề thực tế hơn. Một nơi rất tốt để bắt đầu là Real World Haskell (sách trực tuyến, bạn cũng có thể mua một bản sao cứng). Tôi thấy một vài chương đầu tiên được giới thiệu quá nhanh cho một người chưa bao giờ thực hiện lập trình chức năng / sử dụng đệ quy trước đó. Tuy nhiên với thực tiễn bạn sẽ có từ việc thực hiện các vấn đề trước đó, bạn sẽ thấy nó hoàn toàn dễ hiểu.
Làm việc thông qua các vấn đề trong cuốn sách là một cách tuyệt vời để học cách quản lý trừu tượng và xây dựng các thành phần có thể tái sử dụng trong Haskell. Điều này rất quan trọng đối với những người đã từng sử dụng lập trình hướng đối tượng (oo), vì các phương thức trừu tượng oo bình thường (các lớp oo) không xuất hiện trong Haskell (Haskell có các lớp loại, nhưng chúng rất khác với các lớp oo, giống như các giao diện oo ). Tôi không nghĩ nên bỏ qua các chương, vì mỗi chương giới thiệu rất nhiều ý tưởng mới được sử dụng trong các chương sau.
Sau một thời gian, bạn sẽ đến chương 14, chương đơn nguyên đáng sợ (dum dum dummmm). Hầu như tất cả mọi người học Haskell đều gặp khó khăn trong việc hiểu các đơn nguyên, do khái niệm trừu tượng như thế nào. Tôi không thể nghĩ ra bất kỳ khái niệm nào trong một ngôn ngữ khác trừu tượng như các đơn nguyên trong lập trình chức năng. Monads cho phép nhiều ý tưởng (như hoạt động IO, tính toán có thể thất bại, phân tích cú pháp, ...) được thống nhất theo một ý tưởng. Vì vậy, đừng cảm thấy nản lòng nếu sau khi đọc chương đơn nguyên, bạn không thực sự hiểu chúng. Tôi thấy hữu ích khi đọc nhiều lời giải thích khác nhau về các đơn nguyên; mỗi người đưa ra một quan điểm mới về vấn đề này. Dưới đây là một danh sách rất tốt của các hướng dẫn đơn nguyên . Tôi đánh giá cao All About Monads , nhưng những cái khác cũng tốt.
Ngoài ra, phải mất một thời gian để các khái niệm thực sự chìm đắm. Điều này xuất hiện thông qua việc sử dụng, nhưng cũng qua thời gian. Tôi thấy rằng đôi khi ngủ trên một vấn đề giúp nhiều hơn bất cứ điều gì khác! Cuối cùng, ý tưởng sẽ nhấp vào, và bạn sẽ tự hỏi tại sao bạn phải vật lộn để hiểu một khái niệm mà trong thực tế là vô cùng đơn giản. Thật tuyệt vời khi điều này xảy ra, và khi nó xảy ra, bạn có thể thấy Haskell là ngôn ngữ lập trình mệnh lệnh yêu thích của bạn :)
Để chắc chắn rằng bạn hiểu hệ thống loại Haskell một cách hoàn hảo, bạn nên thử giải 20 bài tập haskell trung gian . Những bài tập sử dụng tên vui của các hàm như "lông" và "chuối" và giúp bạn hiểu rõ về một số khái niệm lập trình chức năng cơ bản nếu bạn chưa có chúng. Cách tốt đẹp để dành buổi tối của bạn với một loạt các giấy tờ được phủ bằng mũi tên, kỳ lân, xúc xích và chuối lông.
Trung gian
Khi bạn hiểu về Monads, tôi nghĩ rằng bạn đã thực hiện quá trình chuyển đổi từ một lập trình viên Haskell mới bắt đầu sang một người bán hàng trung gian. Vậy đi đâu từ đây? Điều đầu tiên tôi muốn giới thiệu (nếu bạn chưa học chúng từ các đơn vị học tập) là các loại đơn vị khác nhau, chẳng hạn như Reader, Nhà văn và Nhà nước. Một lần nữa, Real world Haskell và All about monads đưa ra sự bao quát tuyệt vời về điều này. Để hoàn thành đào tạo đơn nguyên của bạn học về máy biến áp đơn nguyên là phải. Những thứ này cho phép bạn kết hợp các loại Monads khác nhau (chẳng hạn như Reader và State monad) thành một. Điều này có vẻ vô dụng khi bắt đầu, nhưng sau khi sử dụng chúng một thời gian, bạn sẽ tự hỏi làm thế nào bạn sống mà không có chúng.
Bây giờ bạn có thể hoàn thành cuốn sách Haskell trong thế giới thực nếu bạn muốn. Bỏ qua các chương bây giờ không thực sự quan trọng, miễn là bạn có đơn vị vỗ về. Chỉ cần chọn những gì bạn quan tâm.
Với kiến thức bạn có bây giờ, bạn sẽ có thể sử dụng hầu hết các gói trên cabal (ít nhất là các tài liệu ít nhất ...), cũng như hầu hết các thư viện đi kèm với Haskell. Một danh sách các thư viện thú vị để thử sẽ là:
Parsec : để phân tích chương trình và văn bản. Tốt hơn nhiều so với sử dụng regexps. Tài liệu tuyệt vời, cũng có một chương Haskell thế giới thực.
QuickCheck : Một chương trình thử nghiệm rất tuyệt vời. Những gì bạn làm là viết một vị ngữ phải luôn luôn đúng (ví dụ length (reverse lst) == length lst
). Sau đó, bạn chuyển vị từ QuickCheck và nó sẽ tạo ra rất nhiều giá trị ngẫu nhiên (trong trường hợp này là danh sách) và kiểm tra xem vị từ đó có đúng với tất cả các kết quả hay không. Xem thêm hướng dẫn trực tuyến .
HUnit : Đơn vị thử nghiệm trong Haskell.
gtk2hs : Khung gui phổ biến nhất cho Haskell, cho phép bạn viết các ứng dụng gtk trong Haskell.
happstack : Một khung phát triển web cho Haskell. Không sử dụng cơ sở dữ liệu, thay vào đó là một kiểu lưu trữ dữ liệu. Tài liệu khá tốt (các khung phổ biến khác sẽ được snap và yesod ).
Ngoài ra, có nhiều khái niệm (như khái niệm Monad) mà cuối cùng bạn nên tìm hiểu. Điều này sẽ dễ dàng hơn so với việc học Monads lần đầu tiên, vì bộ não của bạn sẽ được sử dụng để đối phó với mức độ trừu tượng liên quan. Một tổng quan rất tốt để tìm hiểu về các khái niệm cấp cao này và cách chúng phù hợp với nhau là typeclassopedia .
Applicative: Một giao diện như Monads, nhưng kém mạnh mẽ hơn. Mọi Monad đều có tính ứng dụng, nhưng không phải ngược lại. Điều này rất hữu ích vì có một số loại là Ứng dụng nhưng không phải là Monads. Ngoài ra, mã được viết bằng các hàm Applicative thường có khả năng tổng hợp nhiều hơn so với viết mã tương đương bằng các hàm Monad. Xem Functor, Functor ứng dụng và Monoids từ tìm hiểu cho bạn một hướng dẫn haskell.
Có thể gập lại , Traversable : Máy đánh chữ trừu tượng nhiều hoạt động của danh sách, để các chức năng tương tự có thể được áp dụng cho các loại container khác. Xem thêm giải thích wiki haskell .
Monoid : Monoid là một loại có giá trị 0 (hoặc mempty) và một hoạt động, được ký hiệu <>
là nối hai Monoids với nhau, như vậy x <> mempty = mempty <> x = x
và x <> (y <> z) = (x <> y) <> z
. Chúng được gọi là luật nhận dạng và kết hợp. Nhiều loại là Monoids, chẳng hạn như số, với mempty = 0
và <> = +
. Điều này rất hữu ích trong nhiều tình huống.
Mũi tên : Mũi tên là một cách biểu diễn các tính toán lấy đầu vào và trả về đầu ra. Hàm là loại mũi tên cơ bản nhất, nhưng có nhiều loại khác. Thư viện cũng có nhiều chức năng rất hữu ích để thao tác với các mũi tên - chúng rất hữu ích ngay cả khi chỉ được sử dụng với các chức năng Haskell cũ.
Mảng : các mảng có thể thay đổi / bất biến trong Haskell.
ST Monad : cho phép bạn viết mã với trạng thái có thể thay đổi chạy rất nhanh, trong khi vẫn giữ nguyên trạng bên ngoài đơn nguyên. Xem các liên kết để biết thêm chi tiết.
FRP: Lập trình phản ứng chức năng, một cách viết mã thử nghiệm mới, xử lý các sự kiện, trình kích hoạt, đầu vào và đầu ra (chẳng hạn như gui). Tôi không biết nhiều về điều này mặc dù. Cuộc nói chuyện của Paul Hudak về yampa là một khởi đầu tốt.
Có rất nhiều tính năng ngôn ngữ mới mà bạn nên xem qua. Tôi sẽ chỉ liệt kê chúng, bạn có thể tìm thấy nhiều thông tin về chúng từ google, wikibook haskell , trang web haskellwiki.org và tài liệu ghc .
- Các loại lớp đa tham số / phụ thuộc chức năng
- Kiểu gia đình
- Các loại định lượng
- Các loại ma
- MAY
- khác...
Rất nhiều Haskell dựa trên lý thuyết thể loại , vì vậy bạn có thể muốn xem xét điều đó. Một điểm khởi đầu tốt là Lý thuyết Danh mục cho Nhà khoa học Máy tính . Nếu bạn không muốn mua cuốn sách, bài viết liên quan của tác giả cũng rất xuất sắc.
Cuối cùng, bạn sẽ muốn tìm hiểu thêm về các công cụ Haskell khác nhau. Bao gồm các:
- ghc (và tất cả các tính năng của nó)
- cabal : hệ thống gói Haskell
- darcs : một hệ thống kiểm soát phiên bản phân tán được viết bằng Haskell, rất phổ biến cho các chương trình Haskell.
- haddock : một trình tạo tài liệu tự động Haskell
Trong khi tìm hiểu tất cả các thư viện và khái niệm mới này, sẽ rất hữu ích khi viết một dự án có quy mô vừa phải trong Haskell. Nó có thể là bất cứ điều gì (ví dụ như một trò chơi nhỏ, phân tích dữ liệu, trang web, trình biên dịch ). Làm việc trên điều này sẽ cho phép bạn áp dụng nhiều điều bạn đang học. Bạn ở cấp độ này trong nhiều năm (đây là nơi tôi đang ở).
Chuyên gia
Bạn sẽ mất nhiều năm để đến giai đoạn này (xin chào từ năm 2009!), Nhưng từ đây tôi đoán bạn bắt đầu viết bài báo, phần mở rộng ghc mới và đưa ra những tóm tắt mới.
Tìm sự giúp đỡ
Cuối cùng, trong khi ở bất kỳ giai đoạn học tập nào, có nhiều nơi để lấy thông tin. Đó là:
- kênh irc #haskell
- các danh sách gửi thư . Đây là những giá trị đăng ký chỉ để đọc các cuộc thảo luận diễn ra - một số rất thú vị.
- những nơi khác được liệt kê trên trang chủ haskell.org
Phần kết luận
Chà điều này hóa ra lâu hơn tôi mong đợi ... Dù sao, tôi nghĩ rằng đó là một ý tưởng rất tốt để trở nên thành thạo Haskell. Phải mất một thời gian dài, nhưng điều đó chủ yếu là do bạn đang học một cách suy nghĩ hoàn toàn mới bằng cách làm như vậy. Nó không giống như học Ruby sau khi học Java, nhưng cũng giống như học Java sau khi học C. Ngoài ra, tôi thấy rằng các kỹ năng lập trình hướng đối tượng của tôi đã được cải thiện nhờ học Haskell, vì tôi đang thấy nhiều cách mới để trừu tượng hóa các ý tưởng.