readFile
следует называть unsafeReadFile
, потому что это небезопасно так же, как unsafeInterleaveIO
. Если вы избегаете функций, которые имеют или должны иметь префикс unsafe
, тогда у вас не будет этой проблемы.
Haskell - это не язык с ленивой оценкой. Это язык, в котором, как и в математике, порядок оценки не имеет значения (за исключением того, что вы не должны тратить неограниченное количество времени, пытаясь оценить аргумент функции до оценки тела функции). Компиляторы могут изменять порядок вычислений по соображениям эффективности, и GH C делает это, поэтому программы, скомпилированные с GH C, как правило, не оцениваются лениво.
readFile
(вместе с getContents
и hGetContents
) - одна из небольшого числа стандартных функций Haskell без префикса unsafe
, которые нарушают семантику значений Haskell. GH C должен специально отключать свои оптимизации, когда сталкивается с такими функциями, потому что они делают программные преобразования наблюдаемыми, которые не должны быть наблюдаемыми.
Эти функции - удобные уловки, которые могут упростить написание некоторых игрушечных программ . Вы не должны использовать их в многопоточном коде или, на мой взгляд, вообще. Я думаю, что их не следует использовать даже во вводных курсах программирования (вероятно, для чего они и предназначались), потому что они дают новичкам совершенно неверное представление о том, как должна работать оценка в Haskell.