2009-07-14 24 views
11

Tôi đã xem các tài nguyên Haskell khác nhau trên web, trước khi mua cuốn sách, Real World Haskell. Nếu không tuyệt vời, nó dường như không chứa bất cứ điều gì về sự hiểu biết danh sách mà tôi đã thấy được đề cập trong các trang web khác nhau mà tôi đã xem xét. Điều này có thể chỉ vì họ thường không được sử dụng trong Haskell cũng viết vì một lý do nào đó, hoặc là nó phức tạp hơn? Ví dụ, cú pháp tìm kiếm kỳ lạ có thể hình dung chỉ là một số hợp nhất của các toán tử mà tôi chưa thấy.Danh sách có phải là một phần chính của Haskell không?

+0

Việc hiểu danh sách được thảo luận (một thời gian ngắn) trong Chương 12 trong sách trực tuyến: http://book.realworldhaskell.org/read/barcode-recognition.html#x_iF1 – mipadi

Trả lời

22

Việc hiểu danh sách được đề cập ngắn gọn trong Chapter 12.

Tôi thấy mình sử dụng kết hợp bản đồ và bộ lọc thường xuyên hơn nhiều so với việc hiểu danh sách trong Haskell, nhưng trong Python, tôi thường sử dụng tính năng hiểu danh sách. Vì vậy, tôi nghĩ rằng một phần của nó là phong cách cá nhân.

Sau khi bạn hiểu cách sử dụng từng phần của việc hiểu danh sách, bạn có thể học thêm gì trong việc hiểu về danh sách? Bạn có đầu vào của bạn, điều kiện của bạn/bảo vệ, và các ứng dụng chức năng của bạn cho danh sách trả lại. Tôi không thực sự nhìn thấy một nhu cầu bảo hành cho một phần lớn về sự hiểu biết danh sách trong một cuốn sách.

+1

Tôi đồng ý ở đây, tôi hiếm khi bận tâm với đường hiểu danh sách . – jrockway

+4

+1) Danh sách hiểu chỉ là đường ... Mặc dù chúng có thể rất tuyệt nếu chúng được định nghĩa cho bất kỳ 'MonadPlus' nào và không chỉ' [a] '...;) – Dario

+4

@Dario - yêu cầu và bạn sẽ nhận được : http://hackage.haskell.org/trac/ghc/wiki/MonadComprehensions –

5

Tính năng đọc danh sách là đường cú pháp để ràng buộc (như trong danh sách liên kết đơn thuần).

Đường cú pháp khác cho điều đó là do-notation. Imho nó là đẹp hơn, và cộng lớn là nó hoạt động cho tất cả các monads.

Nếu việc hiểu danh sách không tồn tại, tôi tin rằng sẽ có ít điều hơn để tìm hiểu và không có gì bị mất (bạn có thể sử dụng ký hiệu thay thế).

Đối số có lợi cho việc hiểu danh sách là nó sẽ làm cho người dùng rõ ràng hơn rằng đó là danh sách. Imho một chữ ký loại sẽ làm việc tốt hơn cho điều đó.

14

Haskell được xác định bằng cách có một bộ nhỏ chức năng ngôn ngữ cốt lõi được bao quanh bởi một tập hợp phong phú các lựa chọn cú pháp. List comprehensions là một lựa chọn, nhưng họ không cung cấp gì mà đường monad mà RWH chi tiêu toàn bộ cuốn sách xây dựng trực giác cho cũng không cung cấp. Có rất nhiều trường hợp Haskell cung cấp hai cú pháp cho cùng một điều, hãy so sánh với vị trí, trường hợp và kiểu tổ hợp theo định hướng tổ hợp, và sự hiểu biết danh sách và đường monad.

Việc hiểu danh sách ban đầu được thực hiện dưới dạng tính toán đơn nguyên, một thực tế đã thay đổi trong "cuộc cách mạng đơn biến hóa lớn của '98" (aka Haskell '98). Trong thực tế, thiết kế của LINQ trong các ngôn ngữ .NET bắt nguồn từ thiết kế đọc đơn nguyên cũ. Việc hiểu danh sách có thể tổng quát hơn nhiều so với chúng, nhưng đã bị cố tình làm tê liệt để làm cho chúng có năng suất dễ dàng hơn để hiểu các thông báo lỗi.

Với số lượng giấy hữu hạn, bạn phải chọn vật liệu cần nhấn mạnh, và RWH tránh nói về chúng nhiều nhất để bạn không rơi vào cái bẫy suy nghĩ về danh sách như bất cứ điều gì đặc biệt.

Điều đó nói rằng, có một đề cập ngắn gọn về chúng trong Chương 12. Vào thời điểm đó đủ trực giác đã được xây dựng cho các khái niệm cơ bản mà họ không thực sự là một mối nguy hiểm.

Cuối cùng, tên của cuốn sách là Real World Haskell. Nó muốn dạy cho bạn những kỹ thuật lập trình thế giới thực tốt. Một số Haskellers (không phải tất cả) tránh hiểu danh sách bởi vì ký hiệu không mở rộng tốt, và bởi vì cuối cùng, bạn có thể muốn quay trở lại và trang bị thêm một biến áp đơn hoặc thứ gì đó và sẽ ghi lại toàn bộ các mã đọc trong monadic phong cách anyways.

[Cập nhật: Hiện tại, GHC đã lấy lại được monad comprehensions phản đối này không thực sự mạnh mẽ như trước đây. Bạn có thể nhận được một số chức năng mới thú vị trong số đó.]

7

Việc hiểu danh sách xuất hiện chủ yếu trong các ví dụ về xử lý danh sách nhỏ, nhiều trong số đó được dự định là có tính toán quá mức về mặt toán học. Khi bạn bắt đầu tham gia các ứng dụng lớn hơn như được bao gồm trong Thế giới thực Haskell, quá trình liệt kê tương ứng với một phần nhỏ hơn nhiều của mã. Và như đã lưu ý, thường thuận tiện khi sử dụng map, filter, fold, zip, v.v., vì đó là sử dụng tính năng hiểu danh sách.

Vì vậy

  • Trong chương trình Haskell thực tế, chỉ có một phần nhỏ của mã xử lý danh sách.

  • Chỉ một phần nhỏ mã Haskell xử lý danh sách xuất hiện đáng kể đẹp hơn khi được viết bằng cách sử dụng danh sách hiểu.

Hầu hết tất cả danh sách hiểu tôi viết ra để tạo danh sách các cặp. Tôi không chắc rằng bất cứ điều gì nên được đọc vào đó, tuy nhiên.

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