我有一个名为 prime-tools
的haskell软件包。当我在包装目录中使用stack ghci
时,我希望它可以打开交互式ghci
并自动import prime-tools
。相反,我发现它加载了.cabal文件中声明的所有模块
例如,这是我的.cabal文件中的摘录,显示了哪些模块的声明:
library
-- Modules exported by the library.
exposed-modules: PrimeTools.MathStuff, PrimeTools.Factors, PrimeTools.PQTrials, PrimeTools.Main, PrimeTools.Base, PrimeTools.Lucas
-- Modules included in this library but not exported.
other-modules: PrimeTools.Extras
这就是我在项目文件夹中运行stack ghci
之后收到ghci>
提示的情况:
Ok, modules loaded: PrimeTools.MathStuff, PrimeTools.Factors, PrimeTools.PQTrials, PrimeTools.Main, PrimeTools.Base, PrimeTools.Lucas, PrimeTools.Extras.
ghci>
加载模块而不是import prime-tools
的问题是,我现在可以使用所有模块中定义的所有函数>是否导出了它们。
通过这种区别引起的问题的一个示例:软件包prime-tools
中有两个模块,它们具有称为pfactor
的函数的实现。其中一个是导出的,旨在由软件包的最终用户使用,而另一个则仅用于内部用途,而不是导出。
在有人评论之前,有两个实现pfactor
的理由,但这与我的问题无关。
我的问题:如何使用stack
自动启动ghci
环境,并使用ghc
的本地版本和 import import 我在其文件夹中运行命令的软件包?
我所需的行为等同于运行以下命令序列:
stack ghci
ghci> :module -PrimeTools.MathStuff
ghci> :module -PrimeTools.Factors
ghci> :module -PrimeTools.PQTrials
ghci> :module -PrimeTools.Main
ghci> :module -PrimeTools.Base
ghci> :module -PrimeTools.Lucas
ghci> :module -PrimeTools.Extras
ghci> import PrimeTools.MathStuff
ghci> import PrimeTools.Factors
ghci> import PrimeTools.PQTrials
ghci> import PrimeTools.Main
ghci> import PrimeTools.Base
ghci> import PrimeTools.Lucas
这里的关键是,我想导入.cabal文件中声明的 exposed-modules load> load 任何模块。不过,我不介意是否也导入了其他模型。有没有办法使用stack
执行此操作,而无需每次运行这么长的命令序列?
合理的解决方法正在定义一个自定义的GHCI宏,以按照您想要的方式导入模块。沿着这些行中的项目root创建一个.ghci
文件:
:{
:def deload (_ -> return
":module -PrimeTools.MathStuffn
import PrimeTools.MathStuff"
)
:}
这样,GHCI中的:deload
命令将从范围中删除,然后重新IMPORT PrimeTools.MathStuff
-您可以将任意多的模块添加到列表中。尽管我已经使用Multiline String语法编写了此内容,但您可以在括号中具有任何String -> IO String
表达式,因此可以随意拼写或扩展它,但您认为合适。