问题标签 [ghc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5525 浏览

haskell - 在 Cygwin 上,如何从 hackage 安装 curl?

在 Windows 命令提示符下,

我已经安装了 Cygwin 的 curl-devel 包,但是从 Cygwin 提示符cabal install curl也失败了,即使我指向它--extra-lib-dirs例如--extra-include-dirs

以上尝试使用的是 ghc-6.10.3、Cabal-1.6.0.3 和 cabal-install-0.6.2。

0 投票
1 回答
259 浏览

haskell - Haddock:无法创建依赖关系图(添加带有 * 或模块标题的部分时)

我从 tarball 源代码编译并安装了 haddock-2.4.2。

在此处为代码添加一些简单的注释:

和运行黑线鳕

产量:

事情看起来不错。(请注意,此模块仅依赖于 GHC 附带的库,而不依赖于其他源模块。)

但是,当我尝试在带有“-- * test”的评论中添加部分(a la http://www.haskell.org/haddock/doc/html/ch03s04.html#id289234 )时,我得到:

我不知道从哪里开始让它工作,因为这个错误消息只告诉我 Haddock.Interface.depanal 没有返回任何东西(根据黑线鳕源的 grep),但没有告诉我如何阻止依赖项分析失败。也许我需要更多命令行参数或对 GHC/base/containers 文档或一些黑线鳕配置文件中缺少的链接目标的引用?

搜索 Google 发现了大量与 hackage 包相同的 cabal 构建错误,但没有关于如何修复它们的信息。

如何添加部分(带星号)并让 Haddock 生成我的文档?我错过了什么(可能很简单)?

0 投票
1 回答
658 浏览

haskell - 我不明白的 GHC 类型错误

我正在自学 Haskell。

我想编写一个函数,它递归地找到第一个具有整数平方根且小于起始数字的数字。

它看起来像这样:

但 GHC 抱怨:

(RealFrac Int) 没有因在 ...

但是,如果我在 GHCi 中键入以下内容,它会愉快地编译它:

我的问题是:为什么在 GHCi 中成功编译的表达式会出现类型错误?

0 投票
6 回答
7502 浏览

haskell - 混合 Erlang 和 Haskell

如果你已经接受了函数式编程范式,那么你很可能同时喜欢 Erlang 和 Haskell。两者都具有纯功能内核和其他优点,例如轻量级线程,使其非常适合多核世界。但也有一些不同之处。

Erlang 是一种经过商业验证的容错语言,具有成熟的分布模型。它具有一个看似独特的功能,即通过热代码加载在运行时升级其版本的能力。(太酷了!)

另一方面,Haskell 拥有所有主流语言中最复杂的类型系统。(我将“主流”定义为任何有出版 O'Reilly 书籍的语言,因此 Haskell 很重要。)它的直线单线程性能看起来优于 Erlang 的,它的轻量级线程看起来也更轻。

我正在尝试为我余下的编码生涯构建一个开发平台,并且想知道是否可以混合 Erlang 和 Haskell 来实现最佳的平台。这个问题有两个部分:

  1. 我想使用 Erlang 作为一种容错 MPI 来将 GHC 运行时实例粘合在一起。每个 GHC 运行时将有一个 Erlang 进程。如果“不可能的事情发生了”并且 GHC 运行时死了,那么 Erlang 进程会以某种方式检测到这一点并且也会死掉。Erlang 的热代码加载和分发功能将继续工作。GHC 运行时可以配置为仅使用一个内核,或本地计算机上的所有内核,或两者之间的任何组合。一旦编写了 Erlang 库,其余的 Erlang 级别代码应该是纯粹的样板文件,并在每个应用程序的基础上自动生成。(例如,可能通过 Haskell DSL。)如何实现至少其中的一些?
  2. 我希望 Erlang 和 Haskell 能够共享同一个垃圾收集器。(这比 1 更进一步。)在 JVM 和 CLR 上运行的语言通过共享运行时实现了更大的质量。我了解在 JVM 或 CLR 上运行 Erlang(热代码加载)和 Haskell(更高种类的多态性)存在技术限制。但是如果只拆分垃圾收集器呢?(有点像函数式语言运行时的开始。)分配显然仍然必须非常快,所以可能需要静态链接该位。并且应该有一些机制来区分可变堆和不可变堆(包括惰性写入一次内存),因为 GHC 需要这个。修改 HIPE 和 GHC 以便垃圾收集器可以共享一个堆是否可行?

请回答任何经验(正面或负面)、想法或建议。事实上,任何反馈(没有直接滥用!)都是受欢迎的。

更新

感谢迄今为止所有 4 条回复——每条回复都至少教会了我一件我不知道的有用的事情。

关于编码生活的其余部分-我将其包括在面颊上以引发辩论,但实际上是真的。我有一个项目,我打算一直工作到我死,它需要一个稳定的平台。

在我上面提出的平台中,我只会写 Haskell,因为样板 Erlang 会自动生成。那么 Haskell 会持续多久呢?好吧,Lisp 仍然在我们身边,而且看起来它不会很快消失。Haskell 是 BSD3 开源并已达到临界质量。如果编程本身在 50 年后仍然存在,我希望 Haskell 或 Haskell 的一些持续发展仍然存在。

更新 2 以响应 rvirding 的帖子

同意——实现一个完整的“Erskell/Haslang”通用虚拟机可能不是绝对不可能的,但确实非常困难。仅将垃圾收集器级别共享为类似于 VM 的东西,虽然仍然很困难,但对我来说听起来要困难一个数量级。在垃圾收集模型中,函数式语言必须有很多共同点——不可变数据(包括 thunk)的不普遍性以及对快速分配的要求。因此,将通用性与单体 VM 紧密捆绑在一起的事实似乎有点奇怪。

虚拟机确实有助于实现临界质量。看看像 F# 和 Scala 这样的“精简”函数式语言是如何起飞的。Scala 可能没有 Erlang 的绝对容错能力,但它为许多与 JVM 相关联的人提供了一条逃生路线。

虽然拥有单个堆使得消息传递速度非常快,但它引入了许多其他问题,主要是进行 GC 变得更加困难,因为它必须是交互式且全局非中断的,因此您不能使用与 per- 相同的更简单算法进程堆模型。

绝对,这对我来说很有意义。GHC 开发团队中非常聪明的人似乎正试图通过并行的“stop the world”GC 解决部分问题。

http://research.microsoft.com/en-us/um/people/simonpj/papers/parallel-gc/par-gc-ismm08.pdf

(显然“停止世界”对于一般 Erlang 的主要用例来说是行不通的。)但即使在“停止世界”可以使用的用例中,它们的加速似乎也不是普遍的。所以我同意你的看法,不太可能有一个普遍最好的 GC,这就是我在我的问题的第 1 部分中指定的原因

GHC 运行时可以配置为仅使用一个内核,或本地计算机上的所有内核,或两者之间的任何组合。

这样,对于给定的用例,我可以在基准测试之后选择采用 Erlang 方式,并运行一个 GHC 运行时(使用单线程 GC)加上每个内核一个 Erlang 进程,并让 Erlang 在内核之间复制内存以获得良好的局部性.

或者,在双处理器机器上,每个处理器有 4 个内核,处理器上有良好的内存带宽,基准测试可能建议我运行一个 GHC 运行时(使用并行 GC)加上每个处理器一个 Erlang 进程。

在这两种情况下,如果 Erlang 和 GHC 可以共享一个堆,那么共享可能会以某种方式绑定到在单个内核上运行的单个 OS 线程。(我在这里超出了我的深度,这就是我问这个问题的原因。)

我还有另一个议程——独立于 GC 对功能语言进行基准测试。我经常阅读 OCaml v GHC v Erlang v 的基准测试结果......并且想知道不同的 GC 混淆了多少结果。如果 GC 的选择可以与函数式语言的选择正交怎么办?GC到底有多贵?看到这个魔鬼倡导者博客文章

http://john.freml.in/garbage-collection-harmful

由我的 Lisp 朋友 John Fremlin 撰写,他很迷人地给出了他的帖子标题“自动垃圾收集是垃圾”。当约翰声称 GC 很慢并且没有真正加速时,我希望能够用一些数字来反驳。

0 投票
6 回答
7412 浏览

haskell - 如何阻止 GHC 生成中间文件?

通过ghc --make foo.hsGHC 编译 haskell 源文件时,总是会留下各种中间文件,而不是foo.exe. 这些是foo.hifoo.o

我经常不得不删除 .hi 和 .o 文件以避免弄乱文件夹。

GHC 是否有命令行选项不留下其中间文件?(当在#haskell 上被问到时,我得到的最佳答案是ghc --make foo.hs && rm foo.hi foo.o.

0 投票
2 回答
675 浏览

haskell - 在 GHC 中使用网络包的问题

我有这个简单的代码:

用 runhaskell 执行失败:

GHCi 也给出了类似的错误信息。我能做些什么呢?

我在 Windows 2000 上使用 GHC 6.10.4。

0 投票
4 回答
756 浏览

haskell - 如何以编程方式检索 GHC 包信息?

更具体地说,给定一个任意包名称,我需要检索library-dirs可以ghc-pkg describe从正在运行的 Haskell 程序内部使用命令获得的相同字段。

0 投票
3 回答
3358 浏览

performance - Haskell中的懒惰和尾递归,为什么会崩溃?

我有一个相当简单的函数来计算一个大列表的元素的平均值,使用两个累加器来保存到目前为止的总和和到目前为止的计数:

现在,用严格的语言来说,这将是尾递归的,不会有问题。然而,由于 Haskell 是懒惰的,我的谷歌搜索让我明白 (s+x) 和 (l+1) 将作为 thunk 传递给递归。所以这整个事情崩溃和燃烧:

进一步谷歌搜索后,我发现seq$!. 这似乎我不明白,因为我在这种情况下使用它们的所有尝试都证明是徒劳的,错误消息说明了无限类型。

最后我找到-XBangPatterns了,它通过改变递归调用解决了这一切:

但我对此并不满意,因为-XBangPatterns目前是扩展。我想知道如何在不使用-XBangPatterns. (也许也能学到一些东西!)

只是为了让您了解我的理解不足,这是我尝试过的(即编译的唯一尝试):

据我所知, seq 应该在这里强制评估 s 和 l 参数,从而避免由 thunk 引起的问题。但我仍然得到堆栈溢出。

0 投票
3 回答
5547 浏览

haskell - 如何在 Haskell 中使用 fromInteger?

在 haskell 中计算 2^8 的一种方法是编写

当试图为此创建一个函数时,定义如下......

我收到以下错误:

我的猜测是我必须在某处使用 fromInteger 函数......我只是不确定在哪里或如何?是接口还是fromInteger,应该怎么用?

谢谢

0 投票
2 回答
1021 浏览

haskell - 如何从 GHC 为 Snow Leopard 获取 64 位二进制文​​件?

我最近将我的操作系统升级到了雪豹,它破坏了我的 GHC。通过在 /usr/bin/ghc 中添加用于 32 位编译的标志(类似于 -optl -m32 -opta -m32 -optc -m32,从这里收集),我能够在一台机器上修复它。现在我无法让它为我的另一台支持 64 位的机器生成 64 位二进制文​​件。32 位标志中断,删除它们也会中断。有小费吗?

当我尝试编译时,我得到这样的东西:

谢谢!