2012-01-19 21 views
11

Tôi có một dự án Haskell thường xuyên sử dụng nhiều tính năng ngôn ngữ và tôi muốn khối mở rộng ngôn ngữ cho từng tệp nguồn giống nhau. Dưới đây là một danh sách,haskell - bất kỳ cách nào để cuộn nhóm pragmas LANGUAGE của riêng bạn?

{-# LANGUAGE Arrows, 
      BangPatterns, 
      DefaultSignatures, 
      DeriveDataTypeable, 
      DeriveFunctor, 
      EmptyDataDecls, 
      FlexibleContexts, 
      FlexibleInstances, 
      FunctionalDependencies, 
      GADTs, 
      GeneralizedNewtypeDeriving, 
      MultiParamTypeClasses, 
      NamedFieldPuns, 
      NoImplicitPrelude, 
      NoMonomorphismRestriction, 
      OverlappingInstances, 
      RankNTypes, 
      RebindableSyntax, 
      ScopedTypeVariables, 
      StandaloneDeriving, 
      TemplateHaskell, 
      TypeFamilies, 
      TypeOperators, 
      TypeSynonymInstances, 
      UndecidableInstances, 
      ViewPatterns #-} 

Có lẽ đối với một số đó là thực hành xấu, nhưng tôi xem xét mở rộng ngôn ngữ là một phần của "Haskell +" mà tôi thường viết mã trong. Và, tôi muốn điều đó trở thành các module trên cùng. Ví dụ: NoImplicitPrelude thay đổi ngôn ngữ một cách đáng kể và tôi muốn nó thống nhất cho tất cả các mô-đun.

Câu hỏi: Làm thế nào tôi có thể đạt được điều này mà không cần sao chép khối ngôn ngữ vào từng tệp? Nó gây phiền nhiễu như thế nào tôi thường học một tính năng ngôn ngữ mới, thêm nó vào module A, sau đó bắt đầu làm việc trên mô-đun B và nhận ra tôi phải sao chép khối ngôn ngữ từ mô-đun A.

Chỉ cần FYI CPP pragma với số #include không không làm thủ thuật! Cảm ơn trước.

+0

trước câu hỏi liên quan đến vious ở đây: http://stackoverflow.com/questions/6005382/haskell-ways-to-have-a-clean-import-block-re-exporting-modules-multiple-im – gatoatigrado

+2

Tôi sẽ đề nghị không bao gồm ' OverlappingInstances' trong danh sách các tiện ích mở rộng mặc định của bạn. – ehird

+0

@ lạ, điểm tốt; nó được sử dụng thỉnh thoảng. – gatoatigrado

Trả lời

14

Sử dụng cabal làm hệ thống xây dựng và liệt kê các tiện ích mở rộng ngôn ngữ bạn muốn trong trường Extensions của phần Library hoặc Executable trong tệp project.cabal của bạn. Sau đó, xóa khối LANGUAGE khỏi các tệp nguồn Haskell của bạn.

Xem Cabal User Guide, bao gồm đoạn thứ ba của phần giới thiệu.


Ghci là nơi tất cả đều đổ xuống. Có nói chuyện về việc thêm một lệnh cabal ghci, nhưng trong khi chờ đợi nó là một chút icky.

Nếu dự án của bạn là thư viện, bạn có thể chạy ghci -package-conf dist/package.conf.inplace.

Nếu bạn muốn tải các module phim để trong ghci, tôi muốn xác định một "chế độ phát triển" lá cờ trong project.cabal của bạn:

Flag development 
    Description:   Development mode: expose all modules, enable warnings. 
    Default:    False 

... có điều kiện tiếp xúc với các module bổ sung trong chế độ phát triển:

Library 
    Exposed-modules:  My.Module, My.Module.Extra 
    if flag(development) 
    Exposed-modules: My.Module.Hidden, My.Module.Secret 
    GHC-Options:  -Wall 
    -- plus your extensions, etc 

... và cho phép một cách rõ ràng chế độ phát triển khi bạn chạy cabal configure:

$ cabal configure -f development 
+0

Có vẻ tốt. Chỉ một câu hỏi: làm thế nào để sử dụng ghci? (tốt nhất là trên bất kỳ mô-đun nào trong dự án - Tôi không muốn chỉnh sửa tệp cabal mỗi lần) – gatoatigrado

+1

Xem chỉnh sửa của tôi. Tôi đã hiểu chính xác quan điểm của bạn về việc không muốn chỉnh sửa tệp cabal mỗi lần? – dave4420

+0

Xin lỗi vì không rõ ràng. Các chỉnh sửa chắc chắn hữu ích, nhưng tôi nghĩ không phải những gì tôi đang tìm kiếm. Giả sử tôi đang làm việc trên mô đun 'A'. Sau đó, không có cabal, tôi có thể gõ 'ghci A', và nó sẽ cố tải. Tôi có thể tải lại với ': r', cho đến khi nó hoạt động, và sau đó tiến hành làm việc trên mô đun' B', bằng cách gõ ': l B' (hoặc thoát và chạy' ghci B'). – gatoatigrado

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