2012-04-24 12 views
24

Me di cuenta de que Data.UnionFind utiliza la mónada IO para proporcionar punteros a través de IORefs. Me imagino que todos felizmente llaman al unsafePerformIO cuando lo usan localmente en código puro, ya que la estructura de datos se entiende tan bien, pero ...Evitar IORefs en código puro

¿Existe un enfoque de limpieza canónica para tales estructuras de datos? ¿Quizás un envoltorio alrededor de IO que hace que el inevitable unsafePerformIO sea menos seguro al "mirar" al prohibir la mayoría de las operaciones de E/S?

+0

Creo que el paquete está destinado a ser utilizado dentro de la mónada IO. La mayoría de los Haskellers se mantienen lo más lejos posible de 'inseguroPerformIO'. –

Respuesta

30

¿Existe un enfoque de limpieza canónica para tales estructuras de datos? ¿Quizás un envoltorio alrededor de IO que hace que el inevitable inseguroPerformIO sea menos seguro al "mirar" al prohibir la mayoría de las operaciones de E/S?

Sí, precisamente. Acaba de inventar the ST monad, introducido por Launchbury and Peyton Jones hace unos 20 años.

La mónada ST solo permite efectos de memoria con alcance local. Es notable porque usa el sistema de tipos para garantizar que los efectos secundarios no sean visibles fuera del alcance del bloque de código que los está usando.

Por lo tanto, siempre que use la memoria solo a través de referencias, solo en el ámbito local, puede evitar unsafePerformIO y usar ST puro en su lugar, por ejemplo, a implement union-find.

+0

Ahh, no me había dado cuenta de que ST tenía referencias internas, gracias. –

+0

El enlace '' 'ST mónada'' anterior está roto. Aquí está el actual: http://hackage.haskell.org/package/base-4.9.1.0/docs/Control-Monad-ST.html –