2012-01-19 20 views
11

Düzenli olarak çok fazla dil özelliği kullanan bir Haskell projem var ve her kaynak dosyasının aynı olması için dil uzantısı bloğunun olmasını istiyorum. İşte aynı genelinde modüller olmak istiyorum, bir liste, bazı kötü bir uygulamadır için belkihaskell - kendi grup LANGUAGE pragmalarını oynatmanın herhangi bir yolu?

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

, ama ben genellikle kod yazmak "Haskell +" bir parçası olmak için dil uzantıları düşünün. Ve. Örneğin, NoImplicitPrelude dili önemli ölçüde değiştirir ve tüm modüller için tek tip olmasını istiyorum.

Soru: Dil bloğunu her dosyaya kopyala yapıştırmadan, bunu nasıl sağlayabilirim? Sık sık yeni bir dil özelliğini nasıl öğrendiğimi, A modülüne ekledikten sonra B modülünde çalışmaya başladığımdan rahatsız edici olur ve dil bloğunu A modülünden kopyalamam gerektiğini fark eder.

Bilginize bir #include ile CPP Pragma değil hile yapar! Şimdiden teşekkürler.

+0

öncesi Burada merak konusu ilgili soru: http://stackoverflow.com/questions/6005382/haskell-ways-to-have-a-clean-import-block-re-exporting-modules-multiple-im – gatoatigrado

+2

Varsayılan uzantılar listenizde OverlappingInstances'. – ehird

+0

@ehird, iyi bir nokta; arada sırada kullanılır. – gatoatigrado

cevap

14
, yapı sistemi olarak

kullanın cabal ve size project.cabal dosyanın Library veya Executable bölümün Extensions alanında istediğiniz dil uzantıları listeler. Ardından, Haskell kaynak dosyalarınızdan LANGUAGE bloğunu kaldırın.

Girişin üçüncü paragrafı dahil Cabal User Guide'a bakın.


Ghci, her şeyin düştüğü yerdir. cabal ghci komutunun eklenmesi hakkında konuşmak var, ama bu arada biraz icky.

Projeniz bir kütüphane ise, ghci -package-conf dist/package.conf.inplace'u çalıştırabilirsiniz. Eğer GHCi içindeki teşhir modülleri yüklemek istiyorsanız

, senin project.cabal bir "geliştirme modu" bayrağını tanımlarsınız:

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

... şartlı geliştirme modunda ekstra modüller maruz:

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 

... ve cabal configure çalıştırdığınızda açıkça geliştirme modunu etkinleştirmek:

$ cabal configure -f development 
+0

Güzel görünüyor. Sadece bir soru: ghci'yi nasıl kullanırım? (tercihen projedeki herhangi bir modülde - her seferinde cabal dosyasını düzenlemek istemiyorum) – gatoatigrado

+1

Düzenlememe bakın. Her seferinde cabal dosyasını düzenlemek istemediğiniz için doğru bir şekilde anladım mı? – dave4420

+0

Belirsiz olduğum için üzgünüm. Düzenlemeler kesinlikle faydalıdır, ama aradığım şeyi düşünmüyorum. 'A' modülünde çalışıyorum varsayalım. Daha sonra, cabal olmadan, 'ghci A' yazabilirim ve yüklemeye çalışır. Çalışana kadar 'r' ile yeniden yükleyebilirim ve' 'l l'' yazarak' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' '' i yazarak '' B' modülünde çalışılır. – gatoatigrado