gpt4 book ai didi

haskell - 如何正确定义你的 'company' Prelude

转载 作者:行者123 更新时间:2023-12-02 18:36:08 37 4
gpt4 key购买 nike

我决定将自己的 Prelude 用于更大的项目(包含一些库和一些可执行文件)。 Prelude 不导出一些部分函数,​​而是导出一些常用函数(即来自 Control.Monad 等)。然而,我正在与如何去做的方式作斗争。我尝试过:

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

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

问题是,1) 我不能只运行 ghci,因为 basemy-common-module 发生冲突。在 2) ghci 中,cabal repl 不知何故不起作用,因为它神秘地失败,“尝试使用未加载的模块‘Prelude’(prelude/Prelude.hs) '。此外,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 加载并且也可以工作。

最佳答案

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

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

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

什么有效:

  • cabal 代表
  • ghci/runghc 可以工作,但您必须使用 ghci -hide-package base 启动它;否则 basemy-prelude 之间会发生冲突

什么不起作用:

  • cabal replmy-prelude 包中。

关于haskell - 如何正确定义你的 'company' Prelude,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35357198/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com