it-swarm.com.ru

: sprint и `seq` вместе - не хватает оценки?

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

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

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

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

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

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

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

5
radrow

Хорошо, я сделал билет на 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

1
radrow