gpt4 book ai didi

haskell - 如何在启动时使用 'stack ghci' 导入而不是加载模块?

转载 作者:行者123 更新时间:2023-12-02 18:50:31 25 4
gpt4 key购买 nike

我有一个名为 prime-tools 的 haskell 包。当我在包目录中使用 stack ghci 时,我希望它打开一个交互式 ghci 并自动导入 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自动启动具有本地版本的ghc导入的ghci环境 我在哪个包的文件夹中运行命令?

我想要的行为相当于运行以下命令序列:

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 文件中声明的暴露模块,并且加载任何模块。不过,我不介意是否也导入了其他模块。有没有一种方法可以使用 stack 来执行此操作,而不必每次都运行这么长的命令序列?

最佳答案

合理的解决方法是定义 a custom GHCi macro以您想要的方式导入模块。按照以下方式在项目根目录中创建一个 .ghci 文件:

:{
:def deload (\_ -> return
":module -PrimeTools.MathStuff\n\
\import PrimeTools.MathStuff"
)
:}

这样,GHCi 中的 :deload 命令将从范围中删除,然后重新导入 PrimeTools.MathStuff ——您可以添加任意数量的模块列表。虽然我是用 multiline string syntax 写的,您可以在括号内使用任何 String -> IO String 表达式,因此您可以随意拼写或扩展它,只要您认为合适。

关于haskell - 如何在启动时使用 'stack ghci' 导入而不是加载模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43433164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com