Программа на Haskell зависает при смешивании скомпилированного и интерпретированного кода

Рассмотрим следующие тривиальные модули:

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
_

Теперь программа зависает навсегда, ghc.exe потребляет 100% одного ядра процессора. Какого черта?

Это становится лучше, хотя:

> 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 сам, он работает отлично:

> Fail2
7

Что, черт возьми, происходит? Я схожу с ума? Это действительно, действительно похоже на какую-то ошибку GHC. Кто-нибудь еще может воспроизвести это, или это просто моя система?

> ghc --version
The Glorious Glasgow Haskell Compilation System, version 8.6.3

(Ничего себе, хорошо. Это действительно не отображает много информации. Я использую 64-битную Windows 7 Pro, и я считаю, что я установил 64-битную сборку GHC.)

Ответы

Ответ 1

Это ошибка в GHC, и она была исправлена в GHC 8.6.4.

Я проверил это с GHC 8.6.3, GHC 8.6.4 и GHC 8.6.5, и последние две версии работают как положено.

Я использовал стек haskell для Windows x64 и использую Windows 10 со всеми установленными обновлениями (по состоянию на 2019-05-25.)

(Для всех версий GHC: пишу ли я runhaskell Fail2 или runhaskell Fail2.hs не имеет значения.)

GHC 8.6.3

это работает:

stack --resolver lts-13.11 runhaskell Fail2

тогда я компилирую Fail1:

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

тогда оригинальная команда runhaskell зависает при запуске Fail2.

тогда я компилирую 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.