haskell 如何配置.ghci文件以导入所有已加载的模块

hts6caw3  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(157)

假设我有一个项目,它只是一堆带练习的Haskell模块。我想提供一个.ghci,它自动将所有模块 * 导入 * 到ghci作用域中。问题是,我不能在.ghci文件中运行import:m +Module.Name
很明显cabal repl正在阅读.ghci文件,因为像提示符这样的选项被读取了。同样,它正确地加载了模块,但是它没有将它们带入范围(只有一个被导入)。如果我试图将import OtherModule添加到.ghci文件,那么我会得到错误
模块是隐藏程序包故障-ghci的成员
也许你需要在你的.cabal文件中把“fail-ghci”添加到build-depends中。
但是我不能把失败-ghci添加到阴谋集团的文件中,因为这个库不能依靠它自己!!
复制。创建一个简单的阴谋计划。例如:

src
 |- Module1.hs  # include dummy function func1 :: Int
 |- Module2.hs  # include dummy function func2 :: Int
fail-ghci.cabal
.ghci

fail-ghci.cabal的含量为

name:           fail-ghci
version:        0.1.0.0
license:        BSD3
license-file:   LICENSE
build-type:     Simple

library
  exposed-modules:
      Module1
    , Module2
  hs-source-dirs:
      src
  build-depends:
      base >=4.7 && <5
  default-language: Haskell2010

如果将.ghci设置为

:set prompt "> "  -- Set this option to ensure .ghci is readed by cabal repl

它将正常工作,并将Module1.hs带入作用域,因此func1可用。但Module2.hs不在作用域中,如果我想使用它,我需要执行import Module2或等效命令。
现在,我希望这在运行cabal repl时自动发生,因为我的项目有很多模块。

:set prompt "> "  -- Set this option to ensure .ghci is readed by cabal repl

import Module2 -- Equivalent :m +Module2

但是ghci无法导入模块,尽管ghci中的命令正确运行。正确的配置是什么?

aydmsdu9

aydmsdu91#

我喜欢的一个解决方法是在项目中添加一个新模块,可能叫做DefaultRepl或类似的模块,它可以导入所有你想要的东西。如果你把它放在暴露模块列表的顶部,那么当你运行cabal repl时,它就会被加载,并把它导入的所有东西都放到作用域中。

pexxcrt2

pexxcrt22#

我想问题是cabal在加载当前项目之前执行了.ghci文件中的命令。实际上,当我在一个类似的项目中执行cabal repl时,启动输出是:

Build profile: -w ghc-9.0.2 -O1
In order, the following will be built (use -v for more details):
 - fail-ghci-0.1.0.0 (first run)
Preprocessing library for fail-ghci-0.1.0.0..
GHCi, version 9.0.2: https://www.haskell.org/ghc/  :? for help
Loaded GHCi configuration from /tmp/scratch/.ghci
[1 of 2] Compiling Module1          ( src/Module1.hs, interpreted )
[2 of 2] Compiling Module2          ( src/Module2.hs, interpreted )
Ok, two modules loaded.
ghci>

我 * 猜测 * 这可能是因为cabal repl启动了一个ghci会话(在启动时加载.ghci文件),然后使用它的API加载项目环境。(我能够确认.ghci文件可以从完全安装的包中导入模块,而不是从当前的cabal repl d项目中导入模块)
我不知道有什么方法可以在项目加载后自动执行命令。但是你 * 可以 * 让你的.ghci文件定义一个快捷命令来导入你想要的所有模块。这样你至少有一个单一的快速命令可以在你进入ghci shell后执行,而不是手动导入所有的模块。类似这样:

:def loadall (const . pure) ":m + *Module1 *Module2"
-- or
:def loadall (const . pure) "import Module1 Module2"
-- or etc

然后,您可以在ghci提示符下输入:loadall来导入您的模块。

相关问题