如何在启动时使用"堆栈ghci"导入而不是加载模块?



我有一个名为 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表达式,因此可以随意拼写或扩展它,但您认为合适。

最新更新