2014-04-27 14 views
9

Trong Haskell, có thể xác định loại dữ liệu trong phạm vi chức năng không? Ví dụ: Tôi đang viết hàm f :: [(Char, Int)] -> [(Char, String)]. Trong việc thực hiện chức năng, tôi sẽ xây dựng một cây từ danh sách đầu vào, và sau đó đi qua cây để xây dựng danh sách đầu ra. Một giải pháp là xác định một kiểu dữ liệu cây mới cụ thể cho vấn đề của tôi, cùng với hai hàm trợ giúp, một để dịch danh sách đầu vào vào Tree và cái kia để đi bộ Tree và xây dựng danh sách đầu ra.Haskell: Xác định loại dữ liệu mới với phạm vi chức năng

Bây giờ hai hàm trợ giúp có thể dễ dàng được kéo vào phạm vi f bằng cách đặt chúng vào một mệnh đề where, nhưng còn về Tree loại nonim tạm thời thì sao? Có vẻ như xấu để gây ô nhiễm không gian tên bằng cách xác định nó bên ngoài phạm vi chức năng, nhưng tôi không biết làm cách nào khác để làm điều đó.

Đối với ngữ cảnh, hóa ra tôi đang tính toán mã hóa Huffman. Tôi không đặc biệt quan tâm đến việc tìm kiếm một thuật toán thay thế tại thời điểm này, vì tôi nghi ngờ rằng nó sẽ thường hữu ích trong Haskell để định nghĩa các kiểu dữ liệu trợ giúp giữa các hàm trợ giúp, vì vậy tôi quan tâm đến các phương pháp chung.

+12

Tất cả khai báo kiểu dữ liệu phải ở cấp cao nhất. Nếu bạn không muốn gây ô nhiễm không gian tên, chỉ cần không xuất datatype. – user2407038

+0

[This] (http://stackoverflow.com/questions/15320391/proposal-for-local-data-declarations-instances) có thể có liên quan. – is7s

Trả lời

6

Không, không thể.

Trong mô-đun Haskell và nhập đủ điều kiện được cho là giải quyết tất cả các vấn đề về không gian tên, như của bạn hoặc xung đột tên trường bản ghi khét tiếng.

Vì vậy, bạn muốn loại chỉ hiển thị với một chức năng nhất định? Đặt loại đó và chức năng đó vào mô-đun mới và (tùy chọn) chỉ xuất chức năng. Chắc chắn, bằng cách làm theo quy ước này, bạn sẽ kết thúc với nhiều mô-đun hơn bình thường, nhưng nếu bạn nghĩ về nó, điều này không thực sự khác với nhiều ngôn ngữ khác. Tuy nhiên, bạn có thể sử dụng nó. Ví dụ, trong Java, nó thường đặt mỗi lớp vào một tệp riêng biệt, cho dù lớp đó nhỏ đến mức nào.

Tôi phải đề cập đến mặc dù xa hầu hết mọi người trong cộng đồng thực sự tuân theo quy ước này. Bạn thường có thể thấy các tên bí ẩn được sử dụng để giải quyết vấn đề này. Cá nhân tôi không tìm thấy một cách tiếp cận rất sạch sẽ và muốn thay vì sử dụng các mô-đun.

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