Bắt đầu với Haskell


755

Trong vài ngày, tôi đã cố gắng xoay quanh mô hình lập trình chức năng trong Haskell. Tôi đã làm điều này bằng cách đọc hướng dẫn và xem screencasts, nhưng dường như không có gì thực sự dính vào. Bây giờ, trong việc học các ngôn ngữ bắt buộc / OO khác nhau (như C, Java, PHP), các bài tập đã là một cách tốt để tôi đi. Nhưng vì tôi không thực sự biết Haskell có khả năng gì và vì có nhiều khái niệm mới để sử dụng, tôi không biết bắt đầu từ đâu.

Vậy, bạn đã học Haskell như thế nào? Điều gì khiến bạn thực sự "phá băng"? Ngoài ra, bất kỳ ý tưởng tốt cho các bài tập bắt đầu?


Câu trả lời:


2476

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ênLậ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 snapyesod ).

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 = xx <> (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<> = +. Đ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.


35
Yay mũi tên! Trước tiên, bạn để các đơn vị định hình bộ não của bạn, sau đó bạn đứng trên đầu và suy nghĩ về các đồng đội, sau đó bạn làm cả hai cùng lúc để có được mũi tên :) Có rất nhiều sức mạnh biểu cảm trong Haskell có thể được mở ra với cấp độ loại lập trình cũng vậy
ephemient

13
@nanothief Monadmạnh hơn, nhưng cũng ít thành phần hơn ... rất nhiều người sử dụng các đơn vị nơi họ có thể nhận được bằng Applicativemã sạch hơn . Hầu hết mọi thứ Functorcũng Monadlà s, nhưng bạn không sử dụng >>=returnkhi nào fmapthì đủ, vì điều này dẫn đến mã đơn giản hơn nhiều nếu bạn có thể sử dụng nó.
Tom Crockett

8
@pelotom, tôi đã thêm liên kết typeclassopedia cũng như một lý do tốt hơn để sử dụng Ứng dụng cho phần đó và xóa phần Functor. Thật khó để có được các khái niệm Monad và Applicative theo đúng thứ tự kể từ khi nhấn mạnh vào Monads trong hầu hết các tài liệu giảng dạy (bao gồm cả RWH). Mặt khác, việc dạy cho bạn một hướng dẫn haskell đã đi một chặng đường dài kể từ khi tôi ban đầu viết câu trả lời (gần 2 năm: O), và dạy Applicative trước Monad, có lẽ đó là cách học được đề xuất.
David Miani

2
Lời khuyên tuyệt vời. Tôi đã bắt đầu điều này hơn một năm trước, và hầu hết đã qua giai đoạn Trung cấp. Phản hồi: Chương đơn nguyên của RWH (chương 14) được giải thích kém. Đọc phiên bản trực tuyến của RWH là có lợi, bởi vì nó chứa các bình luận được cộng đồng hỗ trợ cho chương này. FWIW, Bạn có thể đã phát minh ra Monads , là hướng dẫn đơn nguyên phù hợp nhất với tôi.
Tom

6
@tomf: Cảm ơn! Tôi đã luôn ngạc nhiên về câu trả lời này đã làm tốt như thế nào - đã gần năm năm kể từ khi tôi viết nó nhưng nó vẫn còn mạnh mẽ. Tôi sẽ cần phải cập nhật sớm, vì nó hơi lỗi thời. Nó không đề cập đến ống kính, đường ống, các loại ràng buộc, nền tảng haskell, số cấp độ loại và chúng là những chủ đề mới khá quan trọng kể từ khi nó được viết. Bạn đúng rằng RWH không còn tốt nữa, nó đã không được cập nhật trong một thời gian dài và rất nhiều ví dụ không được biên dịch. Tôi rất vui vì dù sao nó vẫn hữu ích cho bạn.
David Miani

180

Một số đồng nghiệp của tôi đã có kinh nghiệm tốt với Learn You a Haskell for Great Good! .

Hướng dẫn nhắm đến những người có kinh nghiệm về ngôn ngữ lập trình bắt buộc nhưng chưa được lập trình bằng ngôn ngữ chức năng trước đó.

Và kiểm tra câu trả lời ở đây quá


27
Tôi thứ hai này. Ngoài ra, vì không rõ ràng, đây là một liên kết đến phiên bản pdf có thể tải xuống của hướng dẫn: learnyouahaskell.com/learnyouahaskell.pdf Webdesign rất tuyệt, nhưng tôi cũng muốn có một bản sao cho tàu điện ngầm.
Telemachus

8
Tôi đã bắt đầu với điều này, nhưng ý kiến ​​của tôi là bạn nên đến trực tiếp Real World Haskell. Sự khác biệt giống như học C từ K & R hoặc "C for dummies" cố gắng đơn giản, nhưng bỏ lỡ những thứ quan trọng với cách tiếp cận của nó. Tôi nghĩ sẽ tốt hơn nếu chỉ nói thẳng sự thật thay vì cố gắng học Haskell "cách bắt buộc".
John Smith

7
Tôi hoàn toàn YÊU điều này, và tôi đã đầu tư rất nhiều thời gian vào đây và Real World Haskell. IMO, "Learn You a Haskell" mang đến cái nhìn sâu sắc hơn Real World Haskell, mặc dù cả hai đều là tài nguyên tuyệt vời.
Charlie Hoa

7
@ abababa22 Tôi nghĩ đọc LYAH trước và sau đó đến RWH là ý tưởng tốt nhất. LYAH không dạy bạn chỉ Haskell; nó dạy bạn lập trình chức năng. Bạn bắt đầu suy nghĩ theo cách chức năng khi bạn giải quyết vấn đề. Rõ ràng, chỉ LYAH sẽ không đủ để viết một ứng dụng lớn, nhưng nó uốn cong tâm trí của bạn đúng cách. Nếu bạn đến từ nền tảng bắt buộc, đây là cách tốt nhất, IMO
Abdulsattar Mohammed

4
@Telemachus Chỉ cần lưu ý: PDF không phải là phiên bản cuối cùng, ít nhất là nó thiếu chương cuối cùng.
sdcvvc

103

Đây là một cuốn sách hay mà bạn có thể đọc trực tuyến: Real World Haskell

Hầu hết các chương trình Haskell tôi đã thực hiện là để giải quyết các vấn đề của Project Euler .

Một lời khuyên tôi đọc cách đây không lâu là bạn nên có một bộ tiêu chuẩn cho các vấn đề đơn giản mà bạn biết cách giải quyết (về lý thuyết) và sau đó bất cứ khi nào bạn cố gắng học một ngôn ngữ mới, bạn sẽ thực hiện những vấn đề đó bằng ngôn ngữ đó.


2
Real World Haskell theo kinh nghiệm của tôi là tuyệt vời, cho đến khi bạn đạt đến chương 5. Từ đó trở đi tôi sẽ không đề xuất nó.
MasterMastic

Tại sao @MasterMastic? Vấn đề ngoài chương 5 là gì? Tôi muốn biết trước khi tôi tiêu tiền.
Jay Blanchard

@JayBlanchard Trong chương 5, bạn bắt đầu lấy một ví dụ cụ thể về thư viện, điều này thật tuyệt, nhưng họ cho bạn biết họ sẽ làm gì, làm gì, nhưng họ không giải thích tại sao hoàn toàn, và không rõ ràng, và có khá nhiều ma thuật hex chữ. Bạn chỉ đang trải qua các chuyển động. Đó không phải là vấn đề lớn nhất đối với tôi, vấn đề lớn nhất là cuốn sách phụ thuộc rất nhiều vào những ví dụ khó và dài (đủ dài để lấy nhiều hơn cả một chương). Bạn khó có thể chỉ đọc những phần bạn muốn. Tôi nghĩ rằng các tác giả tuyệt vời, kiến ​​thức tuyệt vời nhưng thực hiện cực kỳ kém.
MasterMastic


69

Để thêm vào câu trả lời của người khác - có một cách hữu ích sẽ giúp bạn khi mã hóa (ví dụ: khi giải quyết các vấn đề Euler của dự án): Hoogle . Bạn có thể sử dụng giao diện dòng lệnh hoặc giao diện web .

Dòng lệnh

Sau khi bạn cài đặt nền tảng Haskell, hãy chắc chắn cabal install hoogle

Ví dụ sử dụng Hoogle:

Bạn có một hàm f x = 3 * x + 1và bạn muốn áp dụng nó (5 :: Int), sau đó áp dụng nó vào kết quả và kết quả đó, v.v. và nhận danh sách vô hạn các giá trị đó. Bạn nghi ngờ có thể đã tồn tại một chức năng để hỗ trợ bạn (không dành riêng cho bạn f).

Hàm đó sẽ là kiểu (a -> a) -> a -> [a]nếu nó mất f 5hoặc a -> (a -> a) -> [a]nếu nó mất 5 f(chúng tôi giả sử hàm này dành cho các kiểu chung chứ không chỉInt s)

$ hoogle "a -> (a -> a) -> [a]"
Prelude iterate :: (a -> a) -> a -> [a]

vâng, chức năng bạn cần đã tồn tại và nó được gọi là iterate . bạn sử dụng nó bằng cách iterate func 5!

giao diện web

Kết quả cho ví dụ tương tự có thể được tìm thấy ở đây .


Việc tìm các hàm thư viện chuẩn cho những gì bạn cần trở nên dễ dàng hơn rất nhiều khi bạn hiểu cách hỏi Hoogle về những gì bạn cần.
ankh-morpork

57

Lập trình của Graham Hutton ở Haskell ngắn gọn, hợp lý kỹ lưỡng và những năm giảng dạy của ông Haskell thực sự cho thấy. Nó hầu như luôn luôn là những gì tôi khuyên mọi người bắt đầu, bất kể bạn đi đâu từ đó.

Cụ thể, Chương 8 ("Trình phân tích chức năng") cung cấp nền tảng thực sự mà bạn cần để bắt đầu giao dịch với các đơn vị, và tôi nghĩ đó là nơi tốt nhất để bắt đầu, tiếp theo là All About Monads . (Tuy nhiên, đối với chương đó, xin lưu ý lỗi từ trang web, tuy nhiên: bạn không thể sử dụngdo biểu mẫu mà không có sự trợ giúp đặc biệt nào. Bạn có thể muốn tìm hiểu về máy đánh chữ trước và tự mình giải quyết vấn đề đó.)

Điều này hiếm khi được nhấn mạnh cho người mới bắt đầu Haskell, nhưng nó đáng để học khá sớm không chỉ về việc sử dụng các đơn nguyên, mà còn về việc xây dựng của riêng bạn. Nó không khó, và những cái được tùy chỉnh có thể làm cho một số nhiệm vụ đơn giản hơn.


5
Đây là một cuốn sách hoàn toàn được đánh giá thấp (và câu trả lời). Chương về các trình phân tích cú pháp chức năng, tiếp theo là một chương về IO, thậm chí không đề cập đến các đơn nguyên, thực sự tỏa sáng như một phương pháp sư phạm thanh lịch.
michiakig

52

Đừng cố đọc tất cả các hướng dẫn đơn nguyên với những ẩn dụ vui nhộn. Họ sẽ chỉ khiến bạn bị lẫn lộn thậm chí còn tồi tệ hơn.


5
Đã đồng ý! Xem 'Trừu tượng, trực giác và hướng dẫn đơn giản về sự ngu dốt của Hướng giáo
ShreevatsaR

31

Tôi khuyên bạn nên tham gia kênh irc #haskell và đặt câu hỏi ở đó. Đó là cách tôi học Haskell. Nếu bạn đi qua Real World Haskell như được đề xuất ở trên, câu trả lời trong thời gian thực cho câu hỏi của bạn sẽ giúp ích rất nhiều. Rất nhiều người thông minh trên #haskell viết Haskell cho vui và vì lợi nhuận, vì vậy bạn sẽ nhận được nhiều đầu vào tốt. Thử nó!


5
1 - Để được rõ ràng: Đỗ không tìm hiểu nó chỉ với các kênh IRC. Như trong, đừng đi vào và hỏi "Làm thế nào để tôi viết chương trình haskell? Làm cách nào để thêm số?"
thay thế

Ngoài irc freenode, gần đây cũng có một cuộc thảo luận sôi nổi về haskell trong các cuộc trò chuyện Discord.
Truthadjustr


19

Tôi cũng có thể giới thiệu Yet Another Haskell Tutorial làm phần giới thiệu.

Một tài nguyên học tập tốt khác (có lẽ ở cấp độ trung cấp), đã giúp tôi rất nhiều và chưa được đề cập đến trong các câu trả lời khác như tôi có thể thấy, đó là cuốn Sách đánh máy của Brent Yorge , có thể tìm thấy trong The Monad Reader (Vấn đề 13)

Nó được viết theo một phong cách rất dễ tiếp cận và chứa (trong số nhiều thứ khác), lời khuyên giới thiệu sau đây:

Có hai chìa khóa cho sự khôn ngoan của hacker Haskell:

  1. Hiểu các loại.

  2. Có được một trực giác sâu sắc cho từng loại lớp và mối quan hệ của nó với các loại loại khác, được hỗ trợ bởi sự quen thuộc với nhiều ví dụ.

Bản thân Monad Reader là một kho báu tuyệt đối cho các lập trình viên chức năng (không chỉ các lập trình viên Haskell).


14

Hãy thử viết các chương trình dễ dàng trong đó.

Bạn có thể tìm thấy các nhiệm vụ mẫu trong sách giáo khoa khác nhau, có lẽ.

Tôi không khuyên bạn nên bám vào sách giáo khoa Haskell / FP, chỉ cần thử làm những việc đơn giản với nó: tính toán, thao tác chuỗi, truy cập tệp.

Sau khi tôi giải được một tá, tôi đã phá băng :)

Sau đó, đọc rất nhiều về các khái niệm nâng cao (Monads, Mũi tên, IO, cấu trúc dữ liệu đệ quy), bởi vì haskell là vô hạn và có rất nhiều trong số chúng.


14

Tôi nghĩ rằng nhận ra tính năng của Haskell bằng các ví dụ là cách tốt nhất để bắt đầu trên tất cả.

http://en.wikipedia.org/wiki/Haskell_98_features

Đây là kiểu chữ phức tạp bao gồm các đơn nguyên và mũi tên

http://www.haskell.org/haskellwiki/Typeclassopedia

đối với các vấn đề trong thế giới thực và dự án lớn hơn, hãy nhớ các thẻ này: GHC (trình biên dịch được sử dụng nhiều nhất), Hackage (libraryDB), Cabal (hệ thống tòa nhà), darcs (hệ thống tòa nhà khác).

Một hệ thống tích hợp có thể tiết kiệm thời gian của bạn: http://hackage.haskell.org/pl platform /

cơ sở dữ liệu gói cho hệ thống này: http://hackage.haskell.org/

Wiki của nhà biên soạn GHC: http://www.haskell.org/haskellwiki/GHC

Sau Haskell_98_features và typeclassopedia, tôi nghĩ bạn đã có thể tự mình tìm và đọc tài liệu về chúng

Nhân tiện, bạn có thể muốn kiểm tra một số phần mở rộng ngôn ngữ của GHC có thể là một phần của tiêu chuẩn haskell trong tương lai.

đây là cách tốt nhất của tôi để học haskell. Tôi hy vọng nó có thể giúp bạn.


13

Tôi khuyên bạn trước tiên nên bắt đầu bằng cách đọc hướng dẫn của BONUS , và sau đó đọc Real World Haskell (trực tuyến miễn phí) . Tham gia kênh #Caskell IRC, trên irc.freenode.com và đặt câu hỏi. Những người này hoàn toàn thân thiện với người mới và đã giúp tôi rất nhiều theo thời gian. Ngoài ra, ngay tại đây trên SO là một nơi tuyệt vời để nhận trợ giúp với những thứ bạn không thể nắm bắt! Cố gắng đừng nản lòng, một khi nó nhấp, tâm trí của bạn sẽ được thổi bùng lên.

Hướng dẫn của TIỀN THƯỞNG sẽ giúp bạn thăng hoa và sẵn sàng cho chuyến đi ly kỳ mà Real World Haskell mang lại. Chúc các bạn may mắn!


12

Nếu bạn chỉ có kinh nghiệm với các ngôn ngữ bắt buộc / OO, tôi khuyên bạn nên sử dụng ngôn ngữ chức năng thông thường hơn làm bước đệm. Haskell thực sự khác biệt và bạn phải hiểu rất nhiều khái niệm khác nhau để đi đến bất cứ đâu. Tôi đề nghị xử lý một ngôn ngữ kiểu ML (ví dụ như F #) trước tiên.


Elm có thể là người thân nhất, thân thiện hơn và thân thiện với người mới bắt đầu trong số những lựa chọn thay thế này ...
Pedro Rolo

1
Tôi không đồng ý khi đi qua một tuyến đường tạm thời, như F #. Đối với tôi, nó giống như uống vodka bạn phải nhấm nháp nó một cách nhanh chóng. Đau đớn hơn theo cách đó, nhưng niềm vui cũng có. Các tuyến tạm thời, chỉ dẫn đến sự nhầm lẫn nhiều hơn cho tôi.
Truthadjustr

10

Câu trả lời đầu tiên là một câu hỏi rất hay. Để đạt đến cấp độ Chuyên gia, bạn nên làm Tiến sĩ với một số Chuyên gia.

Tôi đề nghị bạn truy cập trang Haskell: http://haskell.org . Ở đó bạn có rất nhiều tài liệu và rất nhiều tài liệu tham khảo về những thứ cập nhật nhất trong Haskell, được cộng đồng Haskell chấp thuận.


2
Xin lỗi nhưng sử dụng lập luận tiến sĩ ở đây cũng giống như nói rằng bạn phải có một con dao làm bếp 300 $ để trở thành một đầu bếp giỏi. Ngay cả Simon Peyton Jones - cha đẻ của Haskell - cũng không có bằng tiến sĩ. Thực hành và kiên trì là những gì dẫn đến chuyên môn cả ở đây và trong bất kỳ lĩnh vực nào khác.
Petras Purlys
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.