Да!Haskell может сделать это.
Монада ST
Если вы на самом деле используете изменяемые состояния (регистры), которые полностью скрыты от наблюдателя за пределами функции, то выв монаде ST , только для эффектов памяти.Вы входите в мир ST через runST
, и при выходе из функции все эффекты гарантированно не будут видны.
Это точно подходящая вычислительная среда для работы с локальным изменяемым состоянием.
Чисто функциональное состояние: монада состояний
Если, однако,вы на самом деле не мутируете регистры или ячейки, а скорее обновляете чисто функциональное значение много раз, доступна более простая среда: Государственная монада .Это не допускает изменяемого состояния, но создает иллюзию локального состояния.
IO и unsafePerformIO
Наконец, если у вас есть локальные, изменяемые эффекты, как вмонаду ST
, но по тем или иным причинам вам понадобятся операции ввода-вывода в этом состоянии (например, через вызов FFI), вы можете симулировать монаду ST
с почти такой же безопасностью, используя unsafePerformIO
вместо runST
, чтобы ввести локальную среду ввода-вывода.Поскольку у монады ввода-вывода нет хороших типов для обеспечения абстракции, вам необходимо вручную убедиться, что побочные эффекты не будут заметны.