haskell data-structures monads union-find ioref

haskell - Evitando IORefs en código puro



data-structures monads (1)

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

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


¿Existe un enfoque canónico más limpio 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 la mónada ST , presentada por Launchbury y Peyton Jones hace unos 20 años.

La mónada ST solo permite efectos de memoria de ámbito 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 utilice 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, para implementar union-find .