2012-01-19 4 views
11

私は定期的に多くの言語機能を使用するHaskellプロジェクトを持っており、各ソースファイルの言語拡張ブロックを同じにします。ここではリストはたぶんいくつかにそれは悪い習慣だが、私は言語拡張は、私は通常でコードを書く「ハスケル+」の一部であると考えています。そして、私はそれは同じ全体のモジュールになりたい、haskell - LANGUAGEプラグマのグループをロールする方法はありますか?

{-# 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から言語ブロックをコピーしなければならないか分かりません。

#includeのプラグマです!前もって感謝します。

+0

前ここで深刻な関連の質問:http://stackoverflow.com/questions/6005382/haskell-ways-to-have-a-clean-import-block-re-exporting-modiple-im – gatoatigrado

+2

私は、 OverlappingInstances'をデフォルトの拡張機能のリストに追加します。 – ehird

+0

@ehird、良い点;それは時々使用されます。 – gatoatigrado

答えて

14
ビルドシステムとして

使う秘密結社、そしてあなたのproject.cabalファイルのLibraryまたはExecutableセクションのExtensionsフィールドにしたい言語拡張を一覧表示します。その後、HaskellソースファイルからLANGUAGEブロックを削除します。

紹介の第3段落を含む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

いいですね。ただ1つの質問:ghciはどのように使用しますか? (できればプロジェクトのどのモジュールでも、毎回カバールファイルを編集したくない) – gatoatigrado

+1

私の編集を参照してください。毎回カバールファイルを編集したくないというあなたの点を正しく理解しましたか? – dave4420

+0

不明な点をおかけして申し訳ありません。編集は間違いなく便利ですが、私が探しているものではないと思います。モジュールAで作業しているとします。そして、キャバールがなければ、 'ghci A 'と入力すると、ロードしようとします。動作するまで ':r'でリロードし、':l B'と打ち込む(または 'ghci B'を終了して実行する)ことで、モジュール' B'で作業を進めることができます。 – gatoatigrado

関連する問題