考虑以下简单模块:
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。 )
答案 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 Fail2
或runhaskell Fail2.hs
都没什么区别。)
这有效:
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命令崩溃,就像问题所描述的一样。
使用--resolver lts-13.19
(使用GHC 8.6.4),所有命令均按预期工作。
与--resolver lts-13.23
(使用GHC 8.6.5)相同。
只需更新到最新的GHC版本,或至少更新到ghc 8.6.4即可。