He estado leyendo acerca de unsafePerformIO
últimamente, y me gustaría preguntarle algo. Estoy de acuerdo con el hecho de que un lenguaje real debería poder interactuar con el entorno externo, por lo que unsafePerformIO
está algo justificado.¿Cómo saber cuándo una interfaz Haskell aparentemente pura esconde operaciones inseguras?
Sin embargo, a mi leal saber y entender, no conozco ninguna forma rápida de saber si una interfaz/biblioteca aparentemente pura (a juzgar por los tipos) es realmente pura sin inspeccionar el código en busca de llamadas al unsafePerformIO
(la documentación podría omitir mencionarlo). Sé que debe usarse solo cuando esté seguro de que la transparencia referencial está garantizada, pero me gustaría saber de todos modos.
"Sé que debe usarse solo cuando esté seguro de que la transparencia referencial está garantizada" exactamente. Solo se debe usar cuando las operaciones internas no puedan filtrarse hacia el exterior de cualquier forma razonable, es decir, cuando no haya forma de saber si hay algo de ese tipo que esté sucediendo bajo el capó. – leftaroundabout
Por cierto, el uso de 'unsafePerformIO' para interactuar con el entorno externo es exactamente lo que * no * puedes hacer. Se supone que todos los efectos son internos a su código, como la utilización de una variable mutable detrás de escena para implementar la memorización. – ehird
@ehird: Gracias por la explicación adicional, pero cuando escribí "environment" lo quise decir en el sentido más amplio posible, que también incluye bibliotecas externas (no haskell). No pensé en la interacción del usuario. –