Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何正确定义';公司';序曲_Haskell - Fatal编程技术网

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

  • 问题是1)我不能只运行
    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