我们代码库中的几乎每个模块都有以下导入:
import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.Text as Text
Run Code Online (Sandbox Code Playgroud)
我想定义一个本地前奏,这样Map,Set和Text可用的模块导入一个前奏.显然在Haskell中没有办法做到这一点.所以我想知道人们如何在大型Haskell代码库中解决这个问题.
Dan*_*ner 25
我将回答这个问题,尽可能按字面解释:
人们如何在大型Haskell代码库中解决这个问题?
答:他们写
import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.Text as Text
Run Code Online (Sandbox Code Playgroud)
在该需要在每个模块的顶部Map,Set和Text.
根据我的经验,管理导入并不是使用大型代码库的难点的重要部分.跳转到导入列表并Data.Map在发现需要时添加一行的努力完全被在代码库中找到正确位置以进行更改的努力所淹没,知道代码库的全部范围,因此您不会重复努力,并找到单独测试大型应用程序的小块的方法.
与其他答案(CPP)中提出的替代方案相比,这种方式也具有一些技术优势:
Foo.bar在某个地方看到一个标识符,我可以使用我的文本编辑器的正则表达式搜索来找出哪些导入Foo行使命名空间可用而没有花哨的添加来包含#included文件.如果我想找到所有依赖的文件Some.Fancy.Module,我可以通过grepping来了解Some.Fancy.Module..h在计算要监视的文件时,构建更改检测的系统不需要知道额外的文件.等等.一种解决方案是在CPP标头中定义导入列表.
注意:这个答案只是为了说明技术上的可能性; Daniel Wagner的回答通常是更好的选择.
对于包级示例:
my-pkg/
my-pkg.cabal
include/imports.h
src/MyModule.hs
...
Run Code Online (Sandbox Code Playgroud)
include/imports.h:
import Control.Applicative
import Data.Maybe
import Data.Char
Run Code Online (Sandbox Code Playgroud)
在my-pkg.cabal,组件(library,executable,test,...)有一个include-dirs场(即在又对应于一些GHC选项):
library
...
include-dirs: include
Run Code Online (Sandbox Code Playgroud)
然后您可以在任何模块中使用该标头:
{-# LANGUAGE CPP #-}
module MyModule where
#include "imports.h"
-- your code here
mymaybe = maybe
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
761 次 |
| 最近记录: |