История изменений
Исправление quasimoto, (текущая версия) :
Что-то я не понял — чистый код вычисляется (пусть параллельно и нестрого) в какой-то _|_ (там где-то undefined, error, throw и т.п. — всё исключения), либо сложная структура содержит такой код — почему нельзя в чистом коде сделать let result = something in if isEvaluatesToBottom result then somethingElse else result с чистым же значением (result который _точно_ не какой-то _|_, либо somethingElse, ясно, что isEvaluatesToBottom не может просто протащить санк нестрогого вычисления — он должен сказать точно _|_ это или нет (и не содержит ли строгая структура его, поэтому я там поставил !, !! и NFData), но ссылочной прозрачности эта возможность не отменяет)? Мне, вообщем-то, всё равно как оно может быть реализовано, но, да, это явно более специального вида исключения нежели исключения в IO у GHC (без маскировок, асинхронности и т.п.).
Исходная версия quasimoto, :
Что-то я не понял — чистый код вычисляется (пусть параллельно и нестрого) в какой-то _|_ (там где-то undefined, error, throw и т.п. — всё исключения), либо сложная структура содержит такой код — почему нельзя в чистом коде сделать let result = something in if isEvaluatesToBottom result then somethingElse else result с чистым же значением (result который _точно_ не какой-то _|_, либо somethingElse, ясно, что isEvaluatesToBottom не может просто протащить санк нестрогого вычисления — он должен сказать точно _|_ это или нет, но ссылочной прозрачности эта возможность не отменяет)? Мне, вообщем-то, всё равно как оно может быть реализовано, но, да, это явно более специального вида исключения нежели исключения в IO у GHC (без маскировок, асинхронности и т.п.).