Tengo la sensación de que seré muy impopular por decir lo que voy a decir, pero sentí que tenía que responder a parte de la información (en mi opinión errónea) presentada aquí.
Si bien es cierto que insafePerformIO se agregó oficialmente al idioma como parte del anexo de FFI, las razones de esto son en gran parte históricas en lugar de lógicas. Existía extraoficialmente y fue ampliamente utilizado mucho antes de que Haskell tuviera alguna vez un FFI. Nunca fue oficialmente parte del estándar principal de Haskell porque, como habrás observado, fue demasiado vergonzoso. Creo que la esperanza era que desaparecería en algún momento en el futuro, de alguna manera. Bueno, eso no ha sucedido, ni lo hará en mi opinión.
El desarrollo de FFI Addendum proporcionó un pretexto conveniente para inseguroPerformIO para obtener snuck en el estándar de idioma oficial ya que probablemente no parece tan malo aquí, en comparación con agregar la capacidad de llamar al código extranjero (IE C) (donde todas las apuestas están apagadas con respecto a asegurar estáticamente la pureza y la seguridad de tipo de todos modos). También fue conveniente ponerlo aquí por razones esencialmente políticas. Fomentó el mito de que Haskell sería puro, si no fuera por todo ese sucio "mal diseñado" C, o sistemas operativos "mal diseñados", o hardware "mal diseñado" o lo que sea ... Es cierto que inseguroPerformIO se usa regularmente con código relacionado con FFI, pero las razones para esto a menudo tienen más que ver con el mal diseño de la FFI y, en realidad, con Haskell, no es un mal diseño de cualquier cosa extraña que Haskell intente también con la interfaz.
Así que, como dice Norman Ramsey, la posición oficial fue que estaba bien usar unPerformIO inseguro siempre que ciertas obligaciones de prueba fueran satisfechas por quienquiera que lo usara (principalmente que esto no invalida las transformaciones importantes del compilador como -presión de expresión). Hasta aquí todo bien, o al menos uno podría pensar. El verdadero truco es que estas obligaciones de prueba no se pueden satisfacer por lo que es probablemente el caso de uso más común para inseguroPerformIO, que según mi estimación representa más del 50% de todas las formas de riesgo inseguras que hay en la naturaleza. Estoy hablando de la espantosa expresión idiomática conocida como "piratería insegura de PerformIO", que es demostrable (de hecho obviamente) completamente insegura (en presencia de inline y cse).
Realmente no tengo el tiempo, el espacio o la inclinación para entrar en lo que es el "truco inseguro dePerformIO" o por qué es necesario en bibliotecas IO reales, pero la conclusión es que la gente que trabaja en la infraestructura IO de Haskells "atrapado entre una roca y un lugar duro". Pueden proporcionar una API intrínsecamente segura que no tiene una implementación segura (en Haskell), o pueden proporcionar una API intrínsecamente insegura que se puede implementar de forma segura, pero lo que rara vez pueden hacer es proporcionar seguridad en la implementación del diseño de API y.A juzgar por la deprimente regularidad con la que aparece el "truco inseguro de PerformIO" en el código del mundo real (incluidas las bibliotecas estándar de Haskell), parece que la mayoría elige la opción anterior como el menor de los dos males, y solo espera que el compilador no las cosas con inlining, cse o cualquier otra transformación.
Ojalá todo esto no fuera así. Desafortunadamente es.
Con respecto a su edición: Sin embargo, todavía es posible crear una biblioteca funcional que se puede llamar desde un programa imprescindible. En última instancia, le corresponde al programador decidir cuánta funcionalidad está presente. –
No es imposible introducir código impuro, simplemente no es el predeterminado. Y el lenguaje llega a extremos significativos para desalentarlo. Sin embargo, el código impuro ocasionalmente es útil. Especialmente cuando está escondido de forma segura detrás de una interfaz pura. –
Vea también http://stackoverflow.com/questions/1916692/are-side-effects-possible-in-pure-functional-programming y http://stackoverflow.com/questions/1916692/are-side-effects-possible -in-pure-functional-programming y http://stackoverflow.com/questions/2488646/why-are-side-effects-modeled-as-monads-in-haskell –