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