2015-11-27 15 views
10

Tôi về cơ bản từ thế giới python và đã chơi xung quanh với haskell trong vài ngày.Có bất kỳ quy ước đặt tên không gian tên/tiêu chuẩn nào trong haskell không?

Là một người dùng python, không gian tên của thư viện từ hackage/stackage là khó hiểu nhất.

Ví dụ: trong python, chúng tôi sẽ nhập mô-đun Scotty như import scotty, trong khi haskell sẽ làm import Web.Scotty.

Những người bán hàng tải lên thư viện của họ khi xếp chồng hoặc tấn công dường như muốn đặt thư viện của họ dưới các không gian tên của một danh mục (ví dụ: Web, Language, ...).

Để cho dù đó là một cách tiếp cận tốt hay không theo quan điểm của kiểm soát phụ thuộc bên ngoài thảo luận, có bất kỳ quy ước thực tế nào về phân loại này không?

Có bất kỳ hướng dẫn nào được cộng đồng đồng ý như "Đặt các loại thư viện này theo loại Network và đặt các loại thư viện đó theo loại Web hoặc danh mục Data". ?

+3

https://www.haskell.org/cabal/proposal/x138.html cho chúng tôi biết rằng "Mỗi gói có tên gói duy nhất trên toàn cầu, không chứa dấu cách. [...] Cách phân phối tên gói duy nhất không phải là một phần của đặc tả này [...]. " nhưng cũng có https://wiki.haskell.org/Hierarchical_module_names – gxtaillon

+0

Tôi không biết nếu có hướng dẫn bằng văn bản. Tôi tin rằng hầu hết các nhà phát triển chọn điểm trong hệ thống phân cấp hack hiện tại, nơi tìm thấy các thư viện tương tự nhất. Tất nhiên, ngoại lệ tồn tại: ví dụ: 'Web' có thể là' Network.Web'. – chi

+0

Một số ngôn ngữ (ví dụ: Java) prod các nhà phát triển sử dụng các không gian tên riêng biệt như trong 'producer-name.a.b.c'. Trong Haskell, quy ước này chắc chắn không được tuân theo: mỗi gói thường ghép các mô đun của nó trong hệ thống phân cấp hiện có. – chi

Trả lời

5

Tên gói, thẻ gói và tên mô-đun là tất cả những thứ độc lập.

Tên gói là một số nhận dạng tùy ý (miễn là nó không xung đột với bất kỳ ai khác). Thông thường của nó để làm cho nó tất cả các trường hợp thấp hơn với dấu gạch nối giữa các từ. Nếu một số gói là một phần của một gia đình thì định dạng là ví dụ: "llvm-base" với họ của gia đình trước. Theo tên gói Cabal thủ công có thể có chữ cái, số và dấu gạch nối nhưng không có dấu cách. Tôi không biết về bất kỳ dấu chấm câu nào khác, nhưng tôi sẽ tránh nó ngay cả khi Cabal cho phép. Cũng nhờ vào các quy tắc khác nhau về chữ hoa trong tên đường dẫn giữa Windows và Linux có thể có sự nhầm lẫn, do đó, tốt nhất của nó để dính vào trường hợp thấp hơn.

Thẻ được sử dụng để giúp các trang web như Hackage sắp xếp danh sách gói thành các nhóm hữu ích và không có ý nghĩa quan trọng khác.

Trong gói sẽ là một hoặc nhiều mô-đun. Đây là những gì mã nguồn khách hàng sẽ nhập. Các module tồn tại trong một không gian tên phân cấp. Vì vậy, ví dụ gói "parsec" bao gồm một mô-đun "Text.Parsec.Combinator". Bạn có thể nghĩ về các dấu chấm giống như Linux "/" trong tên đường dẫn (và trên thực tế nguồn sẽ nằm trong một tệp tại "src/Text/Parsec/Combinator.hs").

Có một vài tên mô-đun thông thường ở mức cao nhất, chẳng hạn như "Điều khiển", "Dữ liệu", "Văn bản" và "Hệ thống", bạn có thể sử dụng theo công việc chính của mô-đun. Phong cách tốt của nó để sử dụng chúng, nhưng không bắt buộc. Sự xuất hiện của tên gói trong tên mô-đun (ví dụ: "Parsec") chỉ có ở đó để tránh xung đột tên; không có mối quan hệ chính thức giữa tên gói và các mô-đun mà nó nắm giữ.

Có thể có một gói với các mô-đun trong các phân cấp cấp cao nhất khác nhau. Ví dụ, bạn có thể có một gói chứa "System.Foo" và "Data.Foo".

Nói chung "Điều khiển" được sử dụng cho monads và các công cụ liên quan, đặc biệt là bộ phối hợp đơn sắc và mũi tên. Nhưng kể từ khi một đơn nguyên cũng là một kiểu dữ liệu bạn không nên cảm thấy cần phải đặt một loại monadic trong một module riêng biệt chỉ để có được nó vào "Control".

"Dữ liệu" là thiết bị thu thập tất cả. Nếu nghi ngờ, hãy đặt nó trong Dữ liệu.

"Hệ thống" được sử dụng cho các cơ sở hệ điều hành, đặc biệt là những thứ có thể không di động.

"Văn bản" được sử dụng để thao tác văn bản, phân tích cú pháp, in và v.v. Bất cứ điều gì với rất nhiều thao tác chuỗi có lẽ thuộc về đây.

"Đồ họa": hiển nhiên.

Tùy chọn của nó để có tên mô-đun ở một cấp và sau đó là các mô-đun khác bên dưới. Vì vậy, "Text.Parsec" là một mô-đun, và như vậy là "Text.Parsec.Combinators", nhưng nhà thiết kế của Parsec không cần phải bao gồm "Text.Parsec". Khi điều này được thực hiện, điều này thường có nghĩa là mô-đun cấp cao nhất (trong trường hợp này là "Text.Parsec") xuất một tập con chung của các mô-đun con của nó, vì vậy trong nhiều trường hợp, mã máy khách chỉ cần nhập "Text.Parsec" thay vì cả gia đinh.

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