: sprint и `seq` вместе - не хватает оценки? - PullRequest
0 голосов
/ 22 декабря 2018

Я понимаю a `seq` b как "будь строг на a и вычисляй b", поэтому undefined `seq` True бросает и исключение.

Я играю с :sprint и попробовал следующий тест в ghci:

Prelude> x = [True, undefined]
Prelude> :sprint x
x = _

Хорошо, потому что x еще не был вычислен

Prelude> x `seq` True
True
Prelude> :sprint x
x = _

Почему x = _ в данный момент?Я думал, что seq будет оценивать x по крайней мере до _:_ (или, более вероятно, True:_), но его значение все еще остается полностью скрытым.Нужно как-то проверить, не является ли x не undefined, поэтому ему нужно выполнить какую-то оценку, но почему бы не сохранить результат?

Я использую GHC 8.6.3

1 Ответ

0 голосов
/ 27 декабря 2018

Хорошо, я сделал тик на trac (ссылка: https://ghc.haskell.org/trac/ghc/ticket/16089), и, похоже, это ошибка, связанная с другой (https://ghc.haskell.org/trac/ghc/ticket/16096).

Проблема возникла из-за того, какx = y и let x = y были обработаны в GHCi - первый интерпретировался как связывание верхнего уровня (с ограничением мономорфизма по умолчанию), а второй как оператор let в блоке do. Эта проблема подразумевала некоторые другие нежелательныеповедение, такое как, например, отсутствие теневых предупреждений при включении -Wall. Вы можете проверить исправления для этого в этой теме: https://phabricator.haskell.org/D5473

...