假設我有一個專案,它只是一堆帶有練習的 Haskell 模塊。我想提供一個.ghci
自動將所有模塊匯入范圍ghci
的方法。問題是,我不能運行import
也不能:m Module.Name
在.ghci
檔案中運行。
顯然cabal repl
正在讀取.ghci
檔案,因為已讀取提示等選項。它還可以正確加載模塊,但不會將它們帶入范圍(只有一個被匯入)。如果我嘗試添加import OtherModule
到.ghci
檔案,則會收到錯誤訊息
模塊是隱藏包 fail-ghci 的成員
也許您需要在 .cabal 檔案的 build-depends 中添加“fail-ghci”。
但是我不能將fail-ghci添加到cabal檔案中,因為庫不能依賴于自己!!
重現。創建一個簡單的 cabal 專案。例如:
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
因為我的專案有很多模塊。顯而易見的(對我來說)選擇是修改.ghci
為
:set prompt "> " -- Set this option to ensure .ghci is readed by cabal repl
import Module2 -- Equivalent :m Module2
但是 ghci 無法匯入模塊,盡管該命令在 ghci 中正常作業。執行此操作的正確配置是什么?
uj5u.com熱心網友回復:
我喜歡的一種解決方法是向您的專案添加一個新模塊,可能稱為DefaultRepl
或類似的,它可以匯入您想要的所有內容。如果你把它放在暴露模塊串列的頂部,那么它會在你運行時加載,cabal repl
并將它匯入的所有內容都帶入范圍。
uj5u.com熱心網友回復:
我想問題只是 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
)
我不知道有什么方法可以在專案加載后自動執行命令。但是您可以讓您的.ghci
檔案定義一個快捷命令,該命令將匯入您想要的所有模塊。這樣一來,一旦您進入 ghci shell,您至少可以執行一個快速命令,而不是手動匯入所有內容。像這樣的東西:
:def loadall (const . pure) ":m *Module1 *Module2"
-- or
:def loadall (const . pure) "import Module1 Module2"
-- or etc
然后你可以:loadall
在 ghci 提示符下輸入來匯入你的模塊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/506259.html