Tôi đang viết một trình biên dịch Haskell nhỏ, và tôi muốn triển khai càng nhiều Haskell 2010 càng tốt. Trình biên dịch của tôi có thể phân tích cú pháp một mô-đun, nhưng việc hoàn thành các mô-đun cho một chương trình có vẻ là một nhiệm vụ không tầm thường. Tôi đã thực hiện một số ví dụ về các khó khăn, nhưng, mô-đun Haskell có lẽ hợp lệ:Giải quyết việc nhập và xuất mô-đun Haskell cạnh trường hợp
module F(G.x) where
import F as G
x = 2
Đây module F
xuất khẩu G.x
, nhưng G.x
cũng giống như F.x
, vì vậy mô-đun F
xuất khẩu x
nếu, và chỉ nếu, nó xuất khẩu x
.
module A(a) where
import B(a)
a = 2
module B(a) where
import A(a)
Trong ví dụ này, để giải quyết xuất khẩu của module A
trình biên dịch có để kiểm tra xem a
nhập khẩu từ B
là giống như tuyên bố a = 2
, nhưng B
xuất khẩu a
nếu, và chỉ nếu, A
xuất khẩu a
.
module A(f) where
import B(f)
module B(f) where
import A(f)
Trong việc giải quyết các mô-đun A
, trình biên dịch may've cho rằng f
nhập khẩu từ B
tồn tại, ngụ ý rằng A
xuất khẩu f
, do đó B
có thể nhập A(f)
và xuất khẩu f
. Vấn đề duy nhất là không có f
được xác định ở bất cứ đâu :).
module A(module X) where
import A as X
import B as X
import C as X
a = 2
module B(module C, C.b) where
import C
b = 3
module C(module C)
import B as C
c = 4
Xuất tại đây khiến danh sách xuất phụ thuộc lẫn nhau.
Tất cả các ví dụ này phải hợp lệ Haskell, như được xác định bởi thông số kỹ thuật của Haskell 2010.
Tôi muốn hỏi liệu có bất kỳ ý tưởng nào về cách thực hiện đúng và hoàn toàn các mô-đun Haskell không?
Giả sử rằng một module chứa chỉ (đơn giản) bindings biến, import
s (có thể với as
hoặc qualified
), và xuất khẩu danh sách các biến thể có trình độ và module ...
chữ viết tắt. Thuật toán có để có thể:
- tính toán danh sách hữu hạn của biến xuất khẩu của mỗi mô-đun
- liên kết mỗi biến xuất khẩu sang ràng buộc
- liên kết của nó mỗi (có thể đủ điều kiện) biến được sử dụng trong tất cả các mô-đun để ràng buộc của nó
Wow, cảm ơn bạn, tôi thậm chí không hy vọng có thực sự là giấy tờ và thư viện nhắm mục tiêu vấn đề này :) –