混合编译和解释的代码时,Haskell程序挂起

时间:2019-05-24 21:19:00

标签: haskell runtime-error ghc

考虑以下简单模块:

WITH
purchasessum
AS
(
SELECT category,
       customers.name,
       count(transactions.customer_id) purchases,
       rank() OVER (PARTITION BY category
                    ORDER BY count(transactions.customer_id) DESC) rank
       FROM transactions
            INNER JOIN customers
                       ON transactions.customer_id = customers.id
            INNER JOIN tickets
                       ON transactions.ticket_num = tickets.ticket_num
       GROUP BY name,
                category
)
SELECT name,
       purchases,
       category
       FROM purchasessum 
       WHERE rank = 1
       ORDER BY category ASC;

我将它们另存为module Fail1 where identity x = x module Main where import Fail1 main = print (identity 7) Fail1.hs。如果我尝试运行该程序,一切都很好:

Fail2.hs

但是看看这个:

> runhaskell Fail2
7

该程序现在永久挂起,> ghc -O2 --make Fail1 [1 of 1] Compiling Fail1 ( Fail1.hs, Fail1.o ) > runhaskell Fail2 _ 占用了一个CPU内核的100%。什么鬼?

不过,情况会变得更好:

ghc.exe

Er ... wat?

具有讽刺意味的是,如果我自己运行> ghc -O2 --make Fail2 [2 of 2] Compiling Main ( Fail2.hs, Fail2.o ) > runhaskell Fail2 Access violation in generated code when reading 0xffffffffffffffff Attempting to reconstruct a stack trace... Frame Code address * 0x71fdd90 0x3d7ce28 C:\Program Files\Haskell Platform\8.6.3\bin\ghc.exe+0x397ce28 ,它会完美运行:

Fail2.exe

到底发生了什么?我会生气吗这真的看起来真的像某种GHC错误。任何人都可以重现这个,还是仅仅是我的系统?

> Fail2
7

(哇,好的。那确实显示不了太多信息。我运行的是Windows 7 Pro 64位操作系统,我相信我已经安装了64位版本的GHC。 )

1 个答案:

答案 0 :(得分:4)

这是GHC中的错误,已在GHC 8.6.4中修复。

我已经用GHC 8.6.3,GHC 8.6.4和GHC 8.6.5进行了测试,后两个版本按预期工作。

我使用的是x64 Windows haskell stack,并且我正在运行Windows 10,并安装了所有更新(截至2019-05-25。)

(对于所有GHC版本:我写的runhaskell Fail2runhaskell Fail2.hs都没什么区别。)

GHC 8.6.3

这有效:

stack --resolver lts-13.11 runhaskell Fail2

然后我编译Fail1:

stack --resolver lts-13.11 ghc -- -O2 --make Fail1

然后,在运行Fail2时,原始runhaskell命令将挂起。

然后我编译Fail2:

stack --resolver lts-13.11 ghc -- -O2 --make Fail2

然后原始的runhaskell命令崩溃,就像问题所描述的一样。

GHC 8.6.4

使用--resolver lts-13.19(使用GHC 8.6.4),所有命令均按预期工作。

GHC 8.6.5

--resolver lts-13.23(使用GHC 8.6.5)相同。

解决方案

只需更新到最新的GHC版本,或至少更新到ghc 8.6.4即可。