haskell - 有一个干净的进口区块的方法? (重新导出模块?每行多次导入?)

时间:2011-05-14 23:15:10

标签: haskell module import

我经常养成使用标准导入块的习惯,因此在需要时我手头有常用的功能。例如,

-- license block

{-# LANGUAGE Arrows,
            DeriveDataTypeable,
            EmptyDataDecls,
            FlexibleContexts,
            FlexibleInstances,
            FunctionalDependencies,
            GADTs,
            MultiParamTypeClasses,
            NoMonomorphismRestriction,
            RankNTypes,
            ScopedTypeVariables,
            StandaloneDeriving,
            TypeOperators,
            TypeSynonymInstances,
            UndecidableInstances,
            ViewPatterns #-}

module MyModule where

import Prelude hiding (id, (.))
import Control.Arrow
import Control.Category
import Control.Exception
import Control.Monad
import Control.Monad.ST

import Data.Array.Diff
import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.Heap as Heap
import qualified Data.List as List
import qualified Data.List.Key as Key
import Data.List.HT
import Data.Maybe
import Data.STRef
import qualified Data.Text as T

由于我没有使用任何花哨的IDE,我宁愿不在每个文件中阅读它。有没有办法创建某种“标准”/“实用程序”模块,重新导出这些函数的名称,所以我只需键入,

import MyCommonFuncs

代替?

我知道这可能不是一个好的做法,也许在理论上应该添加必要的最小数量的进口,但正如我所说,我有时需要破解,并且少考虑的东西总是好的。

编辑 - 更重要的是,有时我想更改所有文件的块 ,因此单独导入所有内容的当前系统可能很繁琐。例如,假设我需要删除旧的import Time并将其更改为新的[sic?] import System.Time。然后,使用当前系统,我必须编辑所有文件。或者,也许我了解一种新的语言功能,并希望它始终可用 - 然后我必须手动更新旧的源文件。

3 个答案:

答案 0 :(得分:18)

您可以尝试使用语法

module MyCommonFuncs (
    module Control.Arrow,
    module Control.Category,
    module Control.Exception,
    module Control.Monad,
    module Control.Monad.ST
)

import Control.Arrow
import Control.Category
import Control.Exception
import Control.Monad
import Control.Monad.ST

执行此操作时,将导出这些模块中的所有函数,就像在模块MyCommonFuncs本身中定义一样。

对于LANGUAGE pragma,您可以在.cabal文件中定义所需的编译指示,全局使用它们。只是在通过ghci进行测试时没有。

希望这会有所帮助。

答案 1 :(得分:9)

您当然可以编写一个可以重新导出所有这些导入的自定义模块。这实际上是基础库中的常见做法。参见例如import Foreign

module Foreign
        ( module Data.Bits
        , module Data.Int
        , module Data.Word
        , module Foreign.Ptr
        , module Foreign.ForeignPtr
        , module Foreign.StablePtr
        , module Foreign.Storable
        , module Foreign.Marshal
        ...

对于所有这些语言扩展,都不能这样说。在我看来,默认情况下将所有这些都打开并不是一个好习惯,因为它几乎可以保证您将拥有不可移植且对编译器敏感的代码。

答案 2 :(得分:0)

加托

嗯......我立刻想到了#define,所以我用谷歌搜索了“haskell预处理器”,它产生了“有希望”的结果。

我不知道这是一个很好的答案(因为我根本不知道Haskell),但几乎可以肯定答案......我会有兴趣看看大师们提出了什么

干杯队友。基思。

相关问题