Pregunta

Escribí una función en haskell que lleva un par de parámetros como Word32, Cadena de ignorar (alarmada) y salidas IO Word32.Ahora, este es un la función en el verdadero sentido de la palabra: para las mismas entradas, el resultado siempre será el mismo.No hay efectos secundarios.La razón por la función devuelve IO Word32 en lugar de Word32 es que la función de las actualizaciones de muchos de 32 bit Linear Feedback Shift registers (lfsr) y otros registros varias veces en un bucle con el fin de calcular la final Word32 de salida.

Mi pregunta es la siguiente:Dado que esta función efectivamente no tiene efectos secundarios, es posible ocultar las actualizaciones del registro dentro de la implementación de la función, de modo que la función devuelve Word32 y no IO Word32?Si es así, ¿cómo?

¿Fue útil?

Solución

Sí!Haskell puede hacer esto.

El ST mónada

Si se utiliza realmente el estado mutable (registros), que son totalmente oculta al observador fuera de la función, entonces usted está en el ST mónada, una monada para los efectos de memoria solamente.Entrar en el mundo a través de la ST runST, y al salir de la función, todos los efectos están garantizados para no ser visible.

Es precisamente el derecho ambiente computacional para trabajar con el local, el estado mutable.

Puramente funcional del estado:el Estado de mónada

Sin embargo, si usted no está realmente la mutación de los registros o de las células, sino la actualización de una puramente funcional valor muchas veces, un simple medio ambiente está disponible: el Estado de mónada.Esto no permite que el estado mutable, pero da una ilusión de estado local.

IO, y unsafePerformIO

Por último, si usted tiene local, mutable efectos, como en el ST mónada, pero por alguna u otra razón, usted va a necesitar operaciones de e / s en que estado (a través de una FFI llamada), se puede simular la ST mónada, casi con tanta seguridad, mediante el uso de unsafePerformIO, en lugar de runST, para introducir un local IO ambiente.Como la mónada IO no tiene buen tipo para hacer cumplir la abstracción, deberá asegurarse de que los efectos secundarios pueden no ser observables.

Otros consejos

Si ha importado que la función de uso de la FFI, sólo hay que quitar la IO desde el tipo de retorno.Otra cosa, el uso de unsafePerformIO :: IO a -> a de System.IO.Unsafe.Por favor, tenga en cuenta que esta función es una de las más peligrosas funciones en Haskell.No la use, si realmente no estás shure acerca de las consecuencias.Pero para su propósito, parece bien.

Sí, este sería un uso legítimo de insafirmación. Pero está bien, si está realmente seguro de que no hay efectos visibles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top