Как избежать IORefs в чистом коде
Я заметил, что Data.UnionFind использует монаду IO для предоставления указателей через IORefs. Я думаю, что все радостно звонят unsafePerformIO
при локальном использовании в чистом коде, так как структура данных так хорошо понятна, но..
Есть ли канонический более чистый подход к таким структурам данных? Возможно, обертка вокруг IO, которая делает неизбежным unsafePerformIO
менее опасно "смотреть", запрещая большинство операций ввода-вывода?
1 ответ
Есть ли канонический более чистый подход к таким структурам данных? Возможно, обертка вокруг ввода-вывода, которая делает неизбежное unsafePerformIO менее небезопасным "взглядом", запрещая большинство операций ввода-вывода?
Да, именно так Вы только что изобрели монаду ST, представленную Launchbury и Peyton Jones около 20 лет назад.
ST
Монада допускает только локальные эффекты памяти. Это примечательно тем, что он использует систему типов, чтобы гарантировать, что побочные эффекты не будут видны вне области блока кода, который их использует.
Таким образом, пока вы используете память только через ссылки, только в локальной области, вы можете избежать unsafePerformIO
и вместо этого используйте чистый ST, например, для реализации union-find.