随着Cabal-3的发布,来自Hackage的软件包被安装在编译器ghc
和ghc-pkg
一无所知的新位置。换句话说,软件包已安装但未注册为ghc
。Ghci
、ghc
、ghc-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
使用GHC_ENVIRONMENT
更好:
setx GHC_ENVIRONMENT C:\Users\me\.ghc\x86_64-mingw32-8.10.2\environments\default
它有助于ghc
和ghci
。
之后,在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步骤是相似的。
实现这一点的一种方法是使用< 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专门用于调用,但在实例中不专门用于调用,这会降低性能。 但是,一个显式的杂注