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 .