Alberto G. Corona wrote:
Hi haskell cafe:

concerning Stable Names The IO in makeStableName suggest more side effects than makeStableName really do. But still the call isn't pure.

For calls such are makeStableName that gives a different result the FIRST time they are called but return the same result every time in the same session, I suggest to use a Transient monad:

makeStableName doesn't really give 'the same result every time', though. For example:

    *> let sn x = hashStableName <$> makeStableName x
    *> let x = replicate 3 'x' in (,) <$> sn x <* evaluate x <*> sn x
    (18,17)

After x is evaluated in this example, its stable name changes.

Perhaps instead of Transient we could use a name that makes it more clear what is going on, perhaps "ObservingEvaluation". That could also include exception handling, by the way.


makeStableName :: a -> Transient (StableName a)

Why not wrap it up in a class?

    class Monad m => MonadObservingEvaluation m where
        -- what should go here? perhaps:
        liftOE :: ObservingEvaluation a -> m a

Then we can have

    makeStableName :: MonadObservingEvaluation m => a -> m (StableName a)

Which works both in IO and the new monad.


Twan
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to