我们代码库中的几乎每个模块都有以下导入:
import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.Text as Text
我想定义一个本地序言,以便Map
,Set
和Text
可用于导入该序言的模块。显然there is no way to do that in Haskell。所以我想知道人们如何在大型Haskell代码库中解决这个问题。
答案 0 :(得分:25)
我将回答这个问题,尽可能按字面解释:
人们如何在大型Haskell代码库中解决这个问题?
答案:他们写了
import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.Text as Text
位于需要Map
,Set
和Text
的每个模块的顶部。
根据我的经验,管理导入并不是使用大型代码库的难点的重要部分。当您发现需要它时,跳转到导入列表并为Data.Map
添加一行的努力绝对淹没通过在代码库中找到正确的位置进行更改,知道代码库的全部范围,因此您不需要重复工作,并找到单独测试大型应用程序的小块的方法。
与其他答案(CPP)中提出的替代方案相比,这种方式也具有一些技术优势:
Foo.bar
作为标识符,我可以使用我的文本编辑器的正则表达式搜索来找出哪个导入行使Foo
命名空间可用而没有添加任何花哨的#include
d文件。如果我想查找依赖于Some.Fancy.Module
的所有文件,我可以通过点击Some.Fancy.Module
来了解这一点。在计算要监视的文件时,构建更改检测的系统无需了解额外的.h
文件。等等。答案 1 :(得分:6)
一种解决方案是在CPP标头中定义导入列表。
N.B。:这个答案只是为了说明技术上的可能性; Daniel Wagner's answer通常是更好的选择。
对于包级示例:
my-pkg/
my-pkg.cabal
include/imports.h
src/MyModule.hs
...
include/imports.h
:
import Control.Applicative
import Data.Maybe
import Data.Char
在my-pkg.cabal
中,组件(library
,executable
,test
,...)有一个include-dirs
字段(反过来对应一些GHC)选项):
library
...
include-dirs: include
然后您可以在任何模块中使用该标头:
{-# LANGUAGE CPP #-}
module MyModule where
#include "imports.h"
-- your code here
mymaybe = maybe