Я должен разделить ваш вопрос на два вопроса:
Является ли pure x :: IO a
чистым значением или побочным эффектом?
Практически чистая стоимость. В этом коде тип x
равен a
, что является чистым значением.
И тип pure
равен a -> IO a
, который заключает аргумент в IO
, но фактически без каких-либо побочных эффектов.
Так что pure x :: IO a
, кажется, имеет побочный эффект в своем типе, но на самом деле не имеет.
... может ли чистый сделать что-нибудь заметное и не нарушить закон?
Нет. pure
только применяет id
к результату побочного эффекта, вызванного v
.
Пока дело соответствует Применимому закону, побочный эффект вызывает не pure
, а v
.
Я полагаю, вы берете x
в pure x
для v :: IO a
в pure id <*> v
.
Первое является полностью чистым значением, тип которого a
, а второе не является чистым значением: действие, которое может вызвать побочный эффект, возвращая значение, тип которого a
.
И последний вопрос:
Если я определю тип, который инкапсулирует IO, и скажу, породить новый поток, свободен ли GHC для его оптимизации?
Извините, я не уверен в оптимизации.