haskell ioref

haskell - ¿Cuándo usar STRef o IORef?



(2)

Cada uno proporciona la misma funcionalidad, pero para diferentes mónadas. Use IORef si necesita una referencia administrada en IO , y STRef si necesita una en ST s .

EDITAR: un breve ejemplo:

import Control.Monad.ST import Data.IORef import Data.STRef exampleSTRef :: ST s Int exampleSTRef = do counter <- newSTRef 0 modifySTRef counter (+ 1) readSTRef counter exampleIORef :: IO Int exampleIORef = do counter <- newIORef 0 modifyIORef counter (+ 1) putStrLn "im in ur IO monad so i can do I/O" readIORef counter

¿Cuál es exactamente la diferencia entre STRef e IORef y cuándo uso cada uno de ellos? Por lo que puedo decir, ambos son para un estado mutable, ¿cuál es el punto de que ambos existan?


Puedes hacer más cosas en la mónada IO que en la mónada ST . El último proporciona referencias mutables, el primero proporciona referencias mutables, captura de excepciones, hilos y, por supuesto, IO.

Por lo general, es una buena práctica de Haskell utilizar la herramienta "más débil" o "más restringida" disponible que puede resolver su problema, ya que las herramientas "más débiles" tienden a ser más fáciles de entender y analizar (otro lugar que aparece este principio en Haskell es en el Applicative frente a distinción de Monad ).

Entonces, si solo necesita referencias mutables, use ST . Los futuros mantenedores podrán inferir más acerca de lo que hace (y no hace) su función con solo mirar el tipo.

Una situación de ejemplo en la que se ve obligado a usar IORef s (o sus primos MVar s) es cuando tiene que compartir una referencia mutable entre dos subprocesos de ejecución diferentes.

También tenga en cuenta que puede escapar de ST (lo que significa que puede ejecutar cálculos de ST dentro de funciones puras) pero no puede escapar de IO .