В Haskell, можно ли проверить, оценивается ли значение для нормальной нормальной формы головы? Если функция уже существует, я ожидаю, что она будет иметь подпись типа
evaluated :: a -> IO Bool
Есть несколько мест, в которых работает аналогичная функциональность.
A предыдущий ответ познакомил меня с командой :sprint
ghci, который будет печатать только часть значения, которое уже было вынуждено для нормальной нормальной формы головы. :sprint
может наблюдать, было ли оценено значение:
> let l = ['a'..]
> :sprint l
l = _
> head l
'a'
> :sprint l
l = 'a' : _
В IO
возможно изучить свойства, которые в противном случае были бы запрещены. Например, можно сравнить в IO
, чтобы увидеть, были ли два значения взяты из одной и той же декларации. Это обеспечивается StableName
в System.Mem.StableName
и используется для решения проблемы наблюдаемого обмена в data-reify. Связанный StablePtr
не предоставляет механизм проверки, находится ли ссылочное значение в слабой нормальной форме головы.