2010-07-08 68 views
18

Tôi muốn viết mô-đun sẽ xuất lại một số mô-đun đã nhập đủ điều kiện. Một cái gì đó như thế này:GHC từ chối xuất các mô-đun đủ điều kiện

module Foo.A 
    (module Foo.B 
    , module Foo.C 
) where 
import qualified Foo.B 
import qualified Foo.C 

-- bunch of code using Foo.B and Foo.C here 

Có vẻ như nó phải hoạt động; tuy nhiên, GHC in cảnh báo về việc xuất khẩu:

Và GHCI từ chối tải xuất khẩu từ chúng.

Tôi có thể giải quyết vấn đề này bằng cách làm cho việc nhập không đủ tiêu chuẩn, nhưng sau đó đặt tên các xung đột có thể xuất hiện giữa các nhập đó và mã mô-đun chính.

Có cách nào để làm cho GHC xuất các mô-đun này không?

Trả lời

12

Không, đó không chỉ là giới hạn của GHC, đó là cách nhập và xuất được thiết kế để hoạt động trong Haskell.

Mô-đun chỉ có kiểm soát không gian tên của chính nó - nó không thể ảnh hưởng đến những gì mọi người có thể thấy từ các không gian tên khác. Một mô-đun "xuất lại" chỉ là một cách viết tắt để nói "xuất tất cả các ký hiệu trong không gian tên của chính tôi xảy ra có được nhập ở đây từ mô-đun khác đó". Nhưng các ký hiệu mà bạn đã nhập đủ điều kiện không thực sự trong không gian tên của riêng bạn.

Nếu bạn muốn xuất hai biểu tượng khác nhau có cùng tên, bạn sẽ không thể làm điều đó từ một mô-đun. Chia mô-đun thành hai và xuất mỗi phiên bản từ một mô-đun khác.

+4

Nhưng có thể xuất lại các biểu tượng đủ điều kiện; ví dụ, 'import Foo.B' đủ điều kiện sẽ cho phép tôi làm' module Foo.A (Foo.B.sym) '. Tại sao điều này không thể xảy ra với các mô-đun? Tôi không xuất hai biểu tượng có cùng tên; bất kỳ xung đột nào là nội bộ của mô-đun. –

6

Giới hạn này cũng là sự thuận tiện khi mô-đun nhập có nghĩa là khai báo lại một số tên trong mô-đun đã nhập, dựa trên khai báo nhập đủ điều kiện. Ví dụ:

module MyPrelude (succ, module Prelude) where 

import qualified Prelude as P (succ) 
import Prelude hiding (succ) 

succ :: ... 
succ = ... P.succ ... 

thành ngữ này sẽ thực sự khó thể hiện mà không có nhiều độ chi tiết khác. Ngoài ra, hãy tự hỏi "điều này có hợp lý nếu không có mô-đun phân cấp?". Nếu không, thì điều này rất ghc cụ thể và điều thực sự xảy ra khi tham chiếu đến tên mô-đun phân cấp từ một biểu thức không phải là thứ bậc.

Vì lý do tại sao bạn có thể kiểm tra lại các biểu tượng riêng lẻ đủ điều kiện bằng một số tên mô-đun bạn không nhập, điều đó có vẻ giống như một kludge để có được các mô-đun theo kinh nghiệm làm việc theo thứ tự trong ghc. Đạt được Foo.B biểu tượng đủ điều kiện khi nhập Foo.A là huyền diệu, và tôi nghĩ nó bởi vì Tên Foo không còn là tổ tiên thừa kế thực tế hơn Foo.A, nhưng mục đích sử dụng xuất khẩu những thứ có trình độ thay thế là trong trường hợp sử dụng nó từ Foo. Tôi không nghĩ rằng hành vi này có ý nghĩa ở tất cả mà không có phần mở rộng GHC, vì vậy tôi sẽ có một dự đoán hoang dã rằng GHC cụ thể của nó.

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