Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
haskell——拥有干净导入块的方法?(重新导出模块?每行多个导入?)_Haskell_Module_Import - Fatal编程技术网

haskell——拥有干净导入块的方法?(重新导出模块?每行多个导入?)

haskell——拥有干净导入块的方法?(重新导出模块?每行多个导入?),haskell,module,import,Haskell,Module,Import,我经常有一个标准导入块的习惯,所以当我需要它时,我手头有常用的功能。比如说, -- license block {-# LANGUAGE Arrows, DeriveDataTypeable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GAD

我经常有一个标准导入块的习惯,所以当我需要它时,我手头有常用的功能。比如说,

-- 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
。然后,在当前系统中,我必须编辑所有文件。或者,也许我了解了一种新的语言功能,希望它始终可用——然后我必须手动更新旧的源文件。

您可以尝试使用该语法

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
本身中定义一样

至于
语言
pragma,您可以在
.cabal
文件中定义所需的语言,它们被全局使用。只是当通过
ghci
进行测试时,情况并非如此

希望这能有所帮助。

Gato

嗯。。。我立刻想到了定义,所以我在谷歌上搜索了“haskell预处理器”,它产生了一个“有希望的”结果

我不知道这是不是一个好答案(因为我根本不认识哈斯克尔),但几乎可以肯定这是一个答案。。。我很想看看大师们有什么想法


干杯,伙计。Keith.

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


对于所有这些语言扩展,情况并非如此。在我看来,默认情况下启用所有这些功能并不是一个好的做法,因为它几乎可以保证您拥有不可移植的功能,和编译器敏感代码。

如果我在一个文件中看到所有那些类/实例扩展名,而这些扩展名似乎都没有声明,那么我也会暂停阅读其他人的代码,这可能会让我想知道我遗漏了什么。如果你否决了某些内容,最好解释一下原因。CPP当然是问题中语言pragma部分的一个选项。@John L我同意,我认为只有当错误答案排在第一位时(通常是因为它写得很好,尽管不正确),向下投票才有帮助,这里的情况并非如此。这对OPs示例不起作用,因为他使用
as
s来分离集合,这些集合都定义了典型的集合操作,如
过滤器
。这些名称都会冲突,因为Haskell不允许您以限定名称重新导出。
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
        ...