如何正确定义您的公司'序幕

时间:2016-02-12 07:39:53

标签: haskell

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

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

  2. 与上述相同,但改为my-common-module创建My.Prelude。在每个其他模块中创建一个目录' prelude',将其放入hs-source-dirs cabal部分,使用prelude/Prelude.hs创建文件import My.Prelude

  3. 问题在于1)我不能只运行ghci,因为我会发现有冲突的basemy-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 replghcjs

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

    更新:好的,我花了一些时间用这个,我应该花更多的钱。在我看来,1)是正确的方法。 cabal repl有效(感谢Yuras),ghci必须加载ghci -hide-package base并且也可以。

1 个答案:

答案 0 :(得分:3)

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

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

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

什么有效:

  • cabal repl
  • ghci / runghc有效,但您必须以ghci -hide-package base启动它;否则basemy-prelude
  • 之间会发生冲突

什么行不通:

    {li> cabal replmy-prelude包中。
相关问题