2013-06-21 9 views
28

Tôi có mô-đun Haskell và tôi muốn nó xuất tất cả các đối tượng được khai báo trong tệp của nó ngoại trừ một hàm cụ thể local_func.Haskell: ẩn (các) chức năng cụ thể trong xuất mô-đun?

Có cách nào sạch hơn để đạt được điều này bằng cách viết danh sách xuất khẩu liệt kê rõ ràng tất cả các khai báo khác (và cẩn thận giữ danh sách này cập nhật vĩnh viễn)?

Nói cách khác, tôi muốn có điểm tương tự là import MyModule hiding (local_func) nhưng được chỉ định trong mô-đun xuất thay vì tại thời điểm nhập.

Trả lời

26

Theo như tôi biết hiện không có cách nào để thực hiện việc này.

Điều tôi thường làm là có mô-đun trung tâm tái xuất những thứ quan trọng như là cách thuận tiện để nhập mọi thứ cần thiết trong khi không ẩn bất kỳ thứ gì trong các mô-đun xác định những thứ này (trong một số trường hợp - sẽ không thấy trước! - giúp người dùng dễ dàng sửa đổi mọi thứ trong mô-đun của bạn hơn).

Để thực hiện điều này sử dụng cú pháp sau:

-- |Convenient import module 
module Foo.Import (module All) where 

-- Import what you want to export 
import Foo.Stuff as All hiding (local_func) 
-- You can import several modules into the same namespace for this trick! 
-- For example if using your module also requires 'decode' from "Data.Aeson" you can do 
import Data.Aeson as All (decode) 

Bây giờ bạn đã thuận tiện xuất khẩu những điều này.

+3

Lời khuyên tuyệt vời: "giúp bạn dễ dàng sửa đổi mọi thứ trong mô-đun của bạn": Có! Đây là một vấn đề phổ biến trong kinh nghiệm của tôi, và khi một mô-đun đóng gói cabal bị "khóa" với một danh sách xuất quá hạn chế, tôi không biết giải pháp nào tốt hơn là chỉnh sửa và cài đặt lại gói, điều này gây phiền toái. – ntc2

5

Thật không may là không.

Người ta có thể tưởng tượng một bổ sung cú pháp nhỏ cho phép loại điều bạn đang yêu cầu. Ngay bây giờ, bạn có thể viết:

module M (module M) where 

foo = quux 

quux = 1+2 

Bạn có thể xuất toàn bộ mô-đun một cách rõ ràng. Nhưng giả sử chúng tôi đã thêm cú pháp sao cho có thể ẩn khỏi mô-đun đó. Sau đó, chúng tôi có thể viết như sau:

module M (module M hiding (quux)) where 

foo = quux 

quux = 1+2 
Các vấn đề liên quan