我已决定将自己Prelude的项目用于更大的项目(包含一些库和一些可执行文件).Prelude不会导出某些部分函数并导出一些常用函数(即来自Control.Monad等).但是,我正在努力解决这个问题.我试过了:
用base-noprelude.Prelude.hs在模块中创建my-common-module.
与上面相同,但在my-common-module创建中My.Prelude.在所有其他模块创建一个目录"前奏",把它变成hs-source-dirs小集团部分,创建一个文件prelude/Prelude.hs与import My.Prelude
问题是在1)我不能只是跑ghci,因为我有冲突base和my-common-module.在2)ghci工作,cabal repl不知何故不会因为"试图使用未加载的模块'Prelude'(prelude/Prelude.hs)而神秘地失败'.此外,base-noprelude似乎不喜欢ghcjs,我想用于项目的一部分(代码共享).
在我看来,目前唯一的方法是启动每个文件:
import Prelude ()
import My.Prelude
Run Code Online (Sandbox Code Playgroud)
要么
{-# LANGUAGE NoImplicitPrelude #-} -- or extensions: NoImplicitPrelude in .cabal
...
import My.Prelude
Run Code Online (Sandbox Code Playgroud)
'extensions:NoImplicitPrelude'选项在我看来最好,因为它需要导入每个文件,My.Prelude否则它将无法正常工作.我是否遗漏了一些明显的方法来实现自定义Prelude并同时使用cabal repl和ghcjs?
更新:当我手动删除GHC.Event的重新导出时,base-noprelude与GHCJS一起使用.
更新:好的,我花了一些时间,我应该花更多的钱.在我看来,1)是正确的方法.cabal repl作品(感谢Yuras),ghci必须加载ghci -hide-package base并且也能正常工作.
我最终得到了这个似乎有效的设置:
创建一个特殊的包my-prelude。这个包导出Prelude,可以包含其他模块,它可以依赖base. 您可能需要在某些模块中使用{-# LANGUAGE NoImplicitPrelude #-}以避免循环依赖。例如,您可能希望Prelude在单独的文件(例如Orphans.Lib_aeson)中由您的自定义定义和导出一些孤立实例,这些文件需要NoImplicitPrelude.
在您的主项目中,库等将 cabal 中的依赖项从 更改base为base-noprelude, my-prelude.
什么有效:
cabal replghci -hide-package baseghci/runghc 可以工作,但你必须以;开头 否则就会产生base冲突my-prelude什么不起作用:
cabal repl在包裹中my-prelude。