2011-11-18 26 views
19

Mặc dù có một số kinh nghiệm với Lisp và ML, tôi đang gặp rất nhiều khó khăn khi học đọc và (thành ngữ) viết Haskell vì kiểu địa phương có vẻ làTài nguyên để học thành ngữ Haskell (giảm eta, toán tử infix biểu tượng, thư viện, v.v.)

  • làm loại bỏ eta bất cứ khi nào có thể
  • tránh ngoặc ủng hộ khai thác vận hành ưu tiên
  • gói nửa logic của bạn vào bucketloads của quá tải, khai thác trung tố phi tự chữ và số

Điều cuối cùng đặc biệt khó khăn vì có quá nhiều toán tử được xác định trước, mỗi công cụ có quy ước riêng và ngữ nghĩa chung, thường đọc Haskell trở thành bài tập trong Hoogle và :type.

Có bất kỳ hướng dẫn hay nào có kiến ​​thức về khái niệm CS/chức năng không, và thay vào đó tập trung vào các thành ngữ cụ thể của Haskell? Tôi đang tìm thứ gì đó như Real-World Haskell, bắt đầu với một chương trình rất ngây thơ, rõ ràng và sau đó dần dần biến nó thành một phong cách thành ngữ hơn, giới thiệu và giải thích các thành ngữ khi nó đi. Nhưng thay vì giới thiệu và giải thích các khái niệm chung như monads và class classes, nó sẽ giới thiệu các monads cụ thể và các kiểu lớp cụ thể, như "nhưng đây chính xác là những gì mà Monoid thay thế!"

+1

Tôi nghĩ rằng việc học cách "đọc" haskell theo nghĩa đen là một trợ giúp lớn trong việc học cách đọc haskell cho ý nghĩa: http://stackoverflow.com/questions/7746894/are-there-pronounceable-names-for-common- haskell-operator – sclv

+1

Như một sang một bên, bạn có thể muốn xem xét [các ngôn ngữ ghép nối] (http://en.wikipedia.org/wiki/Concatenative_programming_language) chẳng hạn như [Factor] (http://en.wikipedia.org/wiki/Factor_% 28programming_language% 29), cũng như gói [pointfree] (http://hackage.haskell.org/package/pointfree) Haskell, để thông báo khả năng của bạn và mong muốn viết theo kiểu không có điểm. –

+0

[Stanford notesure notes] (http://www.scs.stanford.edu/11au-cs240h/notes/) và [trang ezyang] (http://ezyang.com/haskell.html) rất hữu ích –

Trả lời

24

Các loại lớp cơ bản như Show, EqOrd phải dễ nắm bắt bằng cách đọc tài liệu thư viện do Hoogle và/hoặc Haskell-2010 Language Report tìm thấy.

Tháp số trong Haskell dường như phức tạp (loại Int là một thể hiện của các lớp kiểu whooping 11 theo báo cáo), nhưng nó chỉ hỗ trợ tất cả các loại số hữu ích và số đại diện toán học được phát minh cho chúng tôi: ví dụ: Integer là số nguyên có kích thước tùy ý, Int là số nguyên có kích thước bằng máy bình thường và biểu diễn Peano lười biếng của số nguyên (không phải trong thư viện chuẩn) tỏ ra hữu ích trong việc triển khai các thuật toán đồ thị. Các loại lớp số quan trọng nhất là NumIntegral. Bạn có thể chuyển đổi giữa các loại số nguyên khác nhau bằng cách sử dụng các hàm fromIntegral. Cũng lưu ý rằng các số như 123 có loại Num a => a và có cơ chế mặc định kiểu đặc biệt được thiết kế để giảm nhu cầu khai báo kiểu để chỉ định loại số chính xác mà bạn cần. Trong trường hợp sử dụng nâng cao, điều này có tác dụng với bạn, do đó bạn có thể muốn thay đổi các giá trị mặc định.

Tình huống tương tự là với các loại chuỗi khác nhau: không có đại diện đơn lẻ nào phù hợp với tất cả, vì vậy nhiều biểu tượng trong tự nhiên: String, Data.ByteStringData.Text là quan trọng nhất.

Về các lớp loại phức tạp hơn, nguồn tốt nhất là Typeclassopedia.

Đối với các loại lớp nhất định như Monad, ApplicativeArrow, có rất nhiều hướng dẫn và nghiên cứu chuyên dụng. Tùy thuộc vào kỹ năng toán học của bạn, bạn cũng có thể muốn đọc các bài báo nghiên cứu ban đầu về các khái niệm lý thuyết thể loại đằng sau các loại lớp như "Khái niệm tính toán và monads" xuất sắc của Eugenio Moggi.

Đối với "giảm eta", nó được gọi là Point-Free Style. Bạn có thể nhận được một số thông tin từ các tài liệu tham khảo được đề cập tại liên kết đó.Bạn cũng có thể xem Combinatory Logic, một bài báo năm 1978 bởi John Backus Can programming be liberated from von neumann style? và ngôn ngữ lập trình APL để có được một quan điểm lịch sử phong phú hơn về phong cách không có điểm.

Ngoài ra còn có những cuốn sách tổng quát về Haskell như 'Giới thiệu nhẹ nhàng cho Haskell' và 'Tìm hiểu bạn một Haskell cho Great Good'.

Đối với ưu tiên điều hành - có thực sự vài nhà khai thác bạn phải nhớ: (.), ($)(>>=) được sử dụng nhiều hơn mọi thứ khác (trừ arithmetics tất nhiên nhưng toán tử số học khá ngạc nhiên).

Cú pháp cho tuples và danh sách có vẻ không mang tính biểu tượng đối với tôi. Chỉ là thừa: foo : bar : [] giống với [foo, bar](,) foo bar giống với (foo, bar). Các phiên bản tiền tố của các bộ dữ liệu có số lượng cao hơn như (,,,,) hiếm khi được sử dụng.

Xem thêm http://www.haskell.org/haskellwiki/Section_of_an_infix_operator để được giải thích về các cấu trúc như (+ 2)(2 +) được gọi là các phần.

Ngoài ra, bạn có thể học hỏi từ những thay đổi mà công cụ HLint gợi ý để cải thiện mã của bạn. Tệp thực thi HLint có thể được cài đặt bởi cabal install HLint. Đối với các chủ đề nâng cao, tôi có thể khuyên bạn nên nghiên cứu cấu trúc dữ liệu hoàn toàn chức năng (cho phép bạn thiết kế cấu trúc dữ liệu bất biến hiệu quả và lý do về thời gian tiêu thụ), gọi bằng cách tính toán lambda (cho phép bạn giải thích về những gì được đánh giá và thứ tự) , Hệ thống kiểu Fc (cung cấp cho bạn một số nền tảng về cách trình kiểm tra kiểu haskell hoạt động), ngữ nghĩa denotational (lý luận về không chấm dứt, một phần và đệ quy, và cũng có một số hiểu biết về các khái niệm về độ chặt chẽ, độ tinh khiết và tính tương thích).

+1

+ 1 cho HLint, đó là một công cụ tuyệt vời. – augustss

+1

Bài đăng tuyệt vời! Một lỗi chính tả, ý của bạn là: 'foo: bar: []' giống với '[foo, bar]' –

+0

Cố định, cảm ơn bạn – nponeccop

6

Tôi nghĩ rằng hướng dẫn "Write Yourself a Scheme in 48 Hours" chính xác là những gì bạn đang tìm kiếm. Hướng dẫn này giải thích cách thực hiện một trình thông dịch Scheme trong Haskell; đó là một tài liệu thực sự làm mọi thứ nhấp cho tôi.

Nó có các ví dụ cụ thể về các thành ngữ và ý tưởng khác nhau của Haskell được cuộn lại với nhau trong một dự án tuyệt vời. Điều này đặc biệt tốt cho ai đó có kinh nghiệm trong Lisp, đặc biệt là nếu bạn đã đọc một cái gì đó như SICP hoặc đã thực hiện một thông dịch viên Đề án trước đây. Hướng dẫn rất tuyệt vời, nhưng có thể sẽ dễ dàng hơn nếu bạn làm một việc tương tự trước đây.

Các vấn đề liên quan