Оценка в GHCI 7.8.3

Читаю сейчас книгу по параллельному программированию на Haskell. И там я вижу такой пример:

Prelude> let x = 2 + 3
Prelude> :sp x
x = _
Prelude> x
5
Prelude> :sp x
x = 5

Но вместо этого в моем GHCi 7.8.3 от платформы Haskell 2014.02 я получил такое поведение:

Prelude> let x = 2 + 3
Prelude> :sp x
x = _
Prelude> x
5
Prelude> :sp x
x = _

Смотрите последнюю строку. Почему x не оценивается? Я попытался использовать «seq x ()», и он тоже не оценивается.


person The_Ghost    schedule 27.12.2014    source источник


Ответы (1)


Создание мономорфного типа x решило проблему.

Prelude> let x::Int ; x = 2+3
Prelude> :sp x
x = _
Prelude> x
5
Prelude> :sp x
x = 5

Проблема здесь заключается в том, что 2+3 может быть любым числовым типом, поэтому x больше похоже на замаскированную функцию.

Некоторое время назад GHCi по умолчанию считал эти определения мономорфными. Однако это приводит к тонким ошибкам типов, и эту функцию часто называют «ужасным ограничением мономорфизма». Следовательно, GHCi больше не применяет ограничение мономорфизма.

person chi    schedule 27.12.2014
comment
В качестве дополнительного примечания: ghci отключил ограничение мономорфизма в серии 7.8, так что это ожидаемая разница. - person Carl; 27.12.2014