2012-01-19 4 views
11

저는 정기적으로 많은 언어 기능을 사용하는 Haskell 프로젝트를 가지고 있으며 각 소스 파일의 언어 확장 블록을 동일하게하고 싶습니다. 여기에 내가 그 같은에서 모듈이되고 싶어, 목록, 어떤 나쁜 습관이다에 어쩌면haskell - LANGUAGE pragma 그룹을 롤오버하는 방법은 무엇입니까?

{-# 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 #-} 

입니다,하지만 난 보통 코드를 작성하는 "하스켈 +"의 일부가 될 언어 확장을 고려한다. 그리고. 예를 들어, NoImplicitPrelude은 언어를 극적으로 바꿔 모든 모듈에서 동일한 언어로 사용하고자합니다.

질문 : 각 파일에 언어 블록을 복사하여 붙여 넣지 않고 어떻게이 작업을 수행 할 수 있습니까? 새로운 언어 기능을 익히고 모듈 A에 추가 한 다음 모듈 B에서 작업을 시작하고 모듈 A에서 언어 블록을 복사해야한다는 것을 알게되어 짜증이납니다.

그냥 CPP 플러그 접속 식 #include으로 을 입력하지 마십시오. 트릭을 수행하십시오! 미리 감사드립니다.

+0

사전 여기에 관련된 많은 질문이 있습니다. http://stackoverflow.com/questions/6005382/haskell-ways-to-have-a-clean-import-block-re-exporting-modules-multiple-im – gatoatigrado

+2

나는' OverlappingInstances'를 기본 확장 목록에 추가하십시오. – ehird

+0

@ 새, 좋은 지적; 그것은 가끔씩 사용됩니다. – gatoatigrado

답변

14
빌드 시스템으로

사용 도당, 당신이 당신의 project.cabal 파일의 Library 또는 Executable 섹션의 Extensions 필드에서 원하는 언어 확장을 나열합니다. 그런 다음 Haskell 소스 파일에서 LANGUAGE 블록을 제거하십시오.

소개의 세 번째 단락을 포함하여 Cabal User Guide을 참조하십시오.


Ghci는 모두 아래로 떨어집니다. cabal ghci 명령을 추가하는 방법에 대한 이야기가 있지만 그 동안에는 다소 어려움이 있습니다.

프로젝트가 라이브러리 인 경우 ghci -package-conf dist/package.conf.inplace을 실행할 수 있습니다. 당신이 ghci에 노출되지 않은 모듈을로드하려면

, 당신의 project.cabal에서 "개발 모드"플래그를 정의하는 것 :

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

... 조건부 개발 모드에서 추가 모듈 노출 :

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 

... 그리고 당신이 cabal configure 실행할 때 명시 적으로 개발 모드를 활성화 :

$ cabal configure -f development 
+0

좋아 보인다. 한 가지 질문 : 어떻게 ghci를 사용합니까? (프로젝트의 모든 모듈에서 선호 - 매번 파일을 편집하고 싶지 않음) – gatoatigrado

+1

내 편집을 참조하십시오. 매번 카발 파일을 편집하고 싶지 않다는 요지를 올바르게 이해 했습니까? – dave4420

+0

불명확해서 죄송합니다. 편집은 확실히 유용하지만 내가 찾고있는 것은 아닌 것 같습니다. 모듈'A'에서 일하고 있다고 가정 해 봅시다. 그러면 음모가 없으면 'ghci A'라고 입력하면로드가 시도됩니다. ': r'을 다시 불러 와서 작동시킬 때까지': l B'를 입력 (또는'ghci B'를 종료하고 실행)하여 모듈'B'에 대한 작업을 진행할 수 있습니다. – gatoatigrado

관련 문제