2013-03-01 34 views
7

Tôi đang cố gắng hiểu các máy biến áp đơn nguyên bằng cách triển khai thư viện nhỏ của riêng tôi dựa trên thiết kế của các thư viện hiện có.Thư viện MTL yêu cầu những tiện ích mở rộng ngôn ngữ nào?

Điều tôi đang gặp phải là tiện ích mở rộng ngôn ngữ. Trong MonadError, tiện ích mở rộng duy nhất được đề cập là UndecidableInstances. Tuy nhiên, tôi không thể lấy mã tương tự để biên dịch mà không cần sử dụng FunctionalDependenciesFlexibleInstances.

Ví dụ mà tôi tin đòi hỏi FunDeps:

class (Monad m) => MonadError e m | m -> e where 

Và một trường hợp linh hoạt:

instance MonadError e m => MonadError e (MaybeT m) where 

Làm thế nào để mã MonadError tránh thêm hai phần mở rộng?

Trả lời

11

Bạn không phải đánh vần tất cả các tiện ích mở rộng trong chính tệp nguồn. Các phần mở rộng phổ biến được sử dụng bởi tất cả/hầu hết các mô-đun có thể được liệt kê trong tập tin cabal của dự án. Trong mtl's case:

extensions: 
    MultiParamTypeClasses 
    FunctionalDependencies 
    FlexibleInstances 
+7

Lưu ý: Bạn có thể thực hiện việc này, nhưng nhiều người thích đánh vần các tiện ích bằng 'LANGUAGE' pragmas trong mỗi tệp. Bằng cách đó, các tệp có thể độc lập và có khả năng ghci, và thật dễ dàng để xem những tiện ích mở rộng mà mỗi tệp cụ thể đang sử dụng, vì bạn không cần phải bật mọi tiện ích mở rộng cho từng tệp. Nó phụ thuộc vào phần mở rộng bạn đang sử dụng, và cách phổ biến. – shachaf

+1

@shachaf: Tuyệt đối. Điểm tốt. Cá nhân tôi cũng muốn đánh vần từng phần mở rộng trong mọi tệp nguồn sử dụng chúng. – shang

+2

Cả hai đều hữu ích. Tôi nghĩ cách tiếp cận được khuyến nghị nên là đánh vần các phần mở rộng khi cần thiết cho mỗi tệp bằng cách sử dụng một pragma 'LANGUAGE' và để ghi lại các phần mở rộng cần thiết cho một gói trong trường' other-extensions' của Cabal. Danh sách 'other-extensions' không được kích hoạt theo mặc định, nhưng nó vẫn có thể phục vụ để hiểu những yêu cầu mở rộng nào mà gói có (mà không phải xem tất cả các tệp nguồn riêng lẻ). – kosmikus

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