如何正确定义您的"公司"序曲

ond*_*dra 5 haskell

我已决定将自己Prelude的项目用于更大的项目(包含一些库和一些可执行文件).Prelude不会导出某些部分函数并导出一些常用函数(即来自Control.Monad等).但是,我正在努力解决这个问题.我试过了:

  1. base-noprelude.Prelude.hs在模块中创建my-common-module.

  2. 与上面相同,但在my-common-module创建中My.Prelude.在所有其他模块创建一个目录"前奏",把它变成hs-source-dirs小集团部分,创建一个文件prelude/Prelude.hsimport My.Prelude

问题是在1)我不能只是跑ghci,因为我有冲突basemy-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 replghcjs

更新:当我手动删除GHC.Event的重新导出时,base-noprelude与GHCJS一起使用.

更新:好的,我花了一些时间,我应该花更多的钱.在我看来,1)是正确的方法.cabal repl作品(感谢Yuras),ghci必须加载ghci -hide-package base并且也能正常工作.

ond*_*dra 3

我最终得到了这个似乎有效的设置:

  • 创建一个特殊的包my-prelude。这个包导出Prelude,可以包含其他模块,它可以依赖base. 您可能需要在某些模块中使用{-# LANGUAGE NoImplicitPrelude #-}以避免循环依赖。例如,您可能希望Prelude在单独的文件(例如Orphans.Lib_aeson)中由您的自定义定义和导出一些孤立实例,这些文件需要NoImplicitPrelude.

  • 在您的主项目中,库等将 cabal 中的依赖项从 更改basebase-noprelude, my-prelude.

什么有效:

  • cabal repl
  • ghci -hide-package baseghci/runghc 可以工作,但你必须以;开头 否则就会产生base冲突my-prelude

什么不起作用:

  • cabal repl在包裹中my-prelude