当前位置: 首页 > 知识库问答 >
问题:

如何与cabal-3和ghc (ghc-pkg也是)协同工作?

贝嘉泽
2023-03-14

随着Cabal-3的发布,来自Hackage的软件包被安装在编译器ghcghc-pkg一无所知的新位置。换句话说,软件包已安装但未注册为ghcGhcighcghc-pkg无法工作。

例如

cabal install safe --lib

创建文件 t1.hs

import Safe

t1 = tailMay [1,2,3]

让我们试试:

> ghci t1.hs
GHCi, version 8.10.2: https://www.haskell.org/ghc/:? for help
[1 of 1] Compiling Main (t1.hs, interpreted)

t1.hs: 1: 1: error:
    Could not find module `Safe '
    Use -v (or `: set -v` in ghci) to see a list of the files searched for.
  |
1 | import Safe
  | ^^^^^^^^^^^
Failed, no modules loaded.

这里描述了这个bug

https://github.com/haskell/cabal/issues/6262

在这里

https://gitlab.haskell.org/ghc/ghc/-/issues/17341

我使用作为临时解决方案设置系统变量

GHC_PACKAGE_PATH=C:\Users\me\AppData\Roaming\cabal\store\ghc-8.10.2\package.db;

(Windwos 10,haskell由chocoley开发)

通过在Windows上,安装了Cabal的软件包似乎在ghc/ghci中不可用

但随着更新,我将不得不手动更改此系统变量。

有没有更优雅的解决这个问题的方法?

不幸的是,这个解决方案(通过GHC的环境变量GHC_PACKAGE_PATH)与Cabal不兼容:(

https://github.com/haskell/cabal/issues/1944

共有2个答案

柴深
2023-03-14

使用GHC_ENVIRONMENT更好:

  setx  GHC_ENVIRONMENT C:\Users\me\.ghc\x86_64-mingw32-8.10.2\environments\default

它有助于ghcghci

之后,在C:\用户\我\AppData\漫游\Cabal\config中我们应该添加

  package-db: C:\Users\me\AppData\Roaming\cabal\store\ghc-8.10.2\package.db

它有助于Cabal

不幸是,< code>ghc-pkg仍然存在问题,并使用这样的标志:

  ghc-pkg list --user-package-db="C:\Users\me\AppData\Roaming\cabal\store\ghc-8.10.2\package.db"

Linux步骤是相似的。

尹臻
2023-03-14

实现这一点的一种方法是使用< code> - env标志,使GHC可以在当前目录中使用这些库:

~ $ mkdir /tmp/foo
~ $ cd /tmp/foo
/tmp/foo $ cabal install safe --lib --env .
Resolving dependencies...
Build profile: -w ghc-8.8.3 -O1
In order, the following will be built (use -v for more details):
 - safe-0.3.19 (lib) (requires build)
Configuring library for safe-0.3.19..
Preprocessing library for safe-0.3.19..
Building library for safe-0.3.19..
…
 > Installing library in /home/jojo/.cabal/store/ghc-8.8.3/incoming/new-4056/home/jojo/.cabal/store/ghc-8.8.3/safe-0.3.19-92fbaef88124b4508ce447f6245bc793f7a1748247ae68d10e449150df1069af/lib
t1.hs
/tmp/foo $ cat > t1.hs
import Safe

t1 = tailMay [1,2,3]
/tmp/foo $ ls -a
.  ..  .ghc.environment.x86_64-linux-8.8.3  t1.hs
/tmp/foo $ ghci t1.hs
GHCi, version 8.8.3: https://www.haskell.org/ghc/  :? for help
Loaded package environment from /tmp/foo/.ghc.environment.x86_64-linux-8.8.3
[1 of 1] Compiling Main             ( t1.hs, interpreted )
Ok, one module loaded.
*Main> 

请注意,您可能不应该在实际拥有foo.cabal文件的目录中执行此操作。有关详细信息,请参阅cabal v2安装的文档。

 类似资料:
  • GHC(Glasgow Haskell compiler)是 Haskell 最顶级最好的编程套件,包括一个优化的编译器,生成各种平台的优秀代码,同时还有个交互式系统,让用户使用起来更简单方便,能使用 Haskell 进行快速的开发。它支持多种语言的扩展,包括并发,异常和其他语言的接口(C 语言等等)。

  • 我最近发布了一个关于提高内存使用率/GC的问题,并且已经能够使用s将内存消耗降低到我认为是适当/成比例的水平(并且在此过程中从“从未完成”到当前测试的“非常非常慢”),但似乎仍然存在我认为GC时间过多的问题。 在以下输出中分析测试结果: 以及以下堆可视化: 目前,我使用的是H,这似乎很有帮助,并尝试了增加线程、世代、因子和使用压缩(N-G-F-c)的组合,所有这些都没有导致性能的明显变化或降低。很

  • 我得到类型推断错误,因为GHC不会推断约束变量。一阶统一看起来是不可推论的。在进一步的调查中,我发现插入让绑定改变了类型推断的行为。我想知道GHC在做什么。 这里的代码演示了这个问题。newtype代表一个多态函数,其类型参数受约束。据我所知,GHC不会根据的值推断。 应该可以推断应用程序中的类型: 对于所有c.(对于所有a.c.a.)都有类型

  • 我有一个非常简单的片段: 我在。 从文件中: 函数f是线性的,如果:当它的结果只消耗一次,那么它的参数只消耗一次。直观地说,这意味着在f定义的每一个分支中,它的参数x必须只使用一次。这可以通过 返回x未修改 将x传递给线性函数 在x上进行模式匹配,并以相同的方式使用每个参数一次。 将其作为函数调用,并以相同的方式使用结果一次。 我的函数就是这样做的——模式匹配于,它的参数在中使用一次,这是线性的:

  • 要想团队协作使用Git,就需要用到Git协议。 3.1.1. Git支持的协议 首先来看看数据交换需要使用的协议。 Git提供了丰富的协议支持,包括:SSH、GIT、HTTP、HTTPS、FTP、FTPS、RSYNC及前面已经看到的本地协议等。各种不同协议的URL写法如表15-1所示。 表 15-1:Git支持的协议一览表 协议名称 语法格式 说明 SSH协议(1) ssh://[user@]ex

  • Haskell(使用编译器)比您预期的要快得多。如果使用得当,它可以接近低级语言。(Haskellers最喜欢做的一件事是尝试将C语言的5%以内(甚至超过它,但这意味着您使用的是一个低效的C程序,因为GHC将Haskell编译为C)。)我的问题是,为什么?

  • 来自GHC 7.6的文档: [Y]你通常甚至不需要一开始的专业语用。当编译一个模块M时,GHC的优化器(with-o)会自动考虑在M中声明的每个顶级重载函数,并针对在M中调用它的不同类型对其进行专门化。优化器还会考虑每个导入的内联重载函数,并针对在M中调用它的不同类型对其进行专门化。 和 foo.hs: GHC专门用于调用,但在实例中不专门用于调用,这会降低性能。 但是,一个显式的杂注