什么是具有合格进口的前奏的替代品

时间:2018-04-20 11:11:25

标签: haskell module

我们代码库中的几乎每个模块都有以下导入:

import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.Text as Text

我想定义一个本地序言,以便MapSetText可用于导入该序言的模块。显然there is no way to do that in Haskell。所以我想知道人们如何在大型Haskell代码库中解决这个问题。

2 个答案:

答案 0 :(得分:25)

我将回答这个问题,尽可能按字面解释:

  

人们如何在大型Haskell代码库中解决这个问题?

答案:他们写了

import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.Text as Text

位于需要MapSetText的每个模块的顶部。

根据我的经验,管理导入并不是使用大型代码库的难点的重要部分。当您发现需要它时,跳转到导入列表并为Data.Map添加一行的努力绝对淹没通过在代码库中找到正确的位置进行更改,知道代码库的全部范围,因此您不需要重复工作,并找到单独测试大型应用程序的小块的方法。

与其他答案(CPP)中提出的替代方案相比,这种方式也具有一些技术优势:

  • 减少项目导入时间。加入项目的人越少,他们就能越快起来跑步并独立发挥作用。
  • 更好的工具支持。如果我在某处看到Foo.bar作为标识符,我可以使用我的文本编辑器的正则表达式搜索来找出哪个导入行使Foo命名空间可用而没有添加任何花哨的#include d文件。如果我想查找依赖于Some.Fancy.Module的所有文件,我可以通过点击Some.Fancy.Module来了解这一点。在计算要监视的文件时,构建更改检测的系统无需了解额外的.h文件。等等。
  • 更少的虚假重建。如果您有比实际使用的更多的导入,这可能会导致GHC重建您的模块,即使它不需要重建。

答案 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中,组件(libraryexecutabletest,...)有一个include-dirs字段(反过来对应一些GHC)选项):

library
  ...
  include-dirs: include

然后您可以在任何模块中使用该标头:

{-# LANGUAGE CPP #-}

module MyModule where

#include "imports.h"

-- your code here
mymaybe = maybe