Haskell 如何正确定义';公司';序曲
我已决定将自己的Haskell 如何正确定义';公司';序曲,haskell,Haskell,我已决定将自己的Prelude用于一个更大的项目(包含一些库和一些可执行文件)。Prelude不导出部分函数,而是导出一些常用函数(即从Control.Monad等)。然而,我正在为如何做到这一点而斗争。我试过: 使用base noprelude。在模块my common模块中创建Prelude.hs 与上面相同,但在my common模块中创建my.Prelude。在每个其他模块中创建一个目录“prelude”,将其放入hs source dirscabal部分,使用import My.pre
Prelude
用于一个更大的项目(包含一些库和一些可执行文件)。Prelude不导出部分函数,而是导出一些常用函数(即从Control.Monad
等)。然而,我正在为如何做到这一点而斗争。我试过:
base noprelude
。在模块my common模块中创建Prelude.hs
my common模块中创建my.Prelude
。在每个其他模块中创建一个目录“prelude”,将其放入hs source dirs
cabal部分,使用import My.prelude
创建一个文件prelude/prelude.hs
ghci
,因为我的base
和我的公共模块
冲突。在2)ghci
工作时,cabal repl
由于“试图使用未加载的模块“Prelude”(Prelude/Prelude.hs)而神秘地失败,因此无法正常工作。另外,base noprelude
似乎不喜欢ghcjs
,我想将其用于项目的一部分(代码共享)
在我看来,目前唯一的方法是在每个文件开始时使用:
import Prelude ()
import My.Prelude
或
“extensions:NoImplicitPrelude”选项在我看来是最好的,因为它需要导入每个文件My.Prelude
,否则它将无法工作。我是否错过了一些明显的方法,可以实现定制前奏,同时使用cabalrepl
和ghcjs
更新:当我手动删除GHC.Event的重新导出时,base noprelude与GHCJS一起工作
更新:好的,我花了一些时间在这上面,我应该花更多的时间。在我看来,这是一条正确的道路
cabal repl
有效(感谢Yuras),ghci必须加载ghci-隐藏包库
,并且也有效 我最终完成了这个似乎有效的设置:
- 创建一个特殊的包
。此软件包导出my prelude
,可以包含其他模块,它可以依赖于前奏曲
。您可能需要在某些模块中使用基础
,以避免循环依赖。例如,您可能希望通过自定义的{-#语言NoImplicitPrelude#-}
将一些孤立实例定义并导出到单独的文件中(例如Prelude
),这些文件需要孤立.Lib_aeson
NoImplicitPrelude
- 在您的主项目中,库等将cabal中的依赖项从
更改为base
base noprelude,my prelude
cabalrepl
- ghci/runghc可以工作,但您必须从
开始;否则,ghci-hide package base
和base
my prelude
包中的myprelude
cabalrepl
尝试使用模块“Prelude”
时出现的问题。您能否分享一个完整的1)有效示例?因为它对我不起作用:(我现在确定我在哪里帮助了你:)我创建了一个单独的阴谋集团项目,名为basemyprelude
。这定义了一些东西并导出Prelude.hs
(我不得不在一些子模块中使用一些NoImplicitPrelude
,因为它倾向于循环)。然后我有我自己的项目,“我的项目”在阴谋集团中依赖于base noprelude,base myprelude
。我正在做的项目不是公开的,所以我不能告诉你回购协议。更新:cabal repl
在base myprelude
中不起作用,但在我的项目
中起作用,如果你是这样要求的话。哇,将prelude移动到一个单独的包中是关键技巧,谢谢!你应该把它作为一个真实的答案贴出来,这样我们就可以投票了。
{-# LANGUAGE NoImplicitPrelude #-} -- or extensions: NoImplicitPrelude in .cabal
...
import My.Prelude