+1 Alberto G. Corona wrote: > Hi haskell cafe: > > concerning Stable Names > > http://www.haskell.org/ghc/docs/6.10.4/html/libraries/base/System-Mem-StableName.html > > > makeStableName :: a -> IO (StableName a) > > I Did not test fully my proposal, and I´m thinking aloud, Just to inpire > others and fish some ideas; > > 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 :: a -> Transient (StableName a) > > The key here is to maintain the programmer aware that it is not pure, but > there are no IO and that the results have no meaning from session to > session. > > Instance Monad Transient where > Transient x ↠ f = f x > return x = Transient x > > We can Transient`ize IO calls by means of an implicit memoization: > > liftT:: IO a -> Transient a > liftT= < whatever memoization code> > liftT2=.... > liftT3=.... > > Memorization then is embedded in the monad transformation > This may be more elegant than IO plus unsafePerformIO and is more > informative for the programmer. The transition form IO to pure can be done > in two steps, see below > > Instead of unsafePerformIO, we can use: > > unsafePurifyTransient :: Transient a -> a > unsafePurifyTransient (Transient x) = x > > for the inherently transient calls > > A safer version of unsafePerformIO using implicit memoization could be: > unsafePerformIOT :: IO a -> a > unsafePerformIOT = unsafePurifyTransient . liftT > > unsafePerformIOT guatantee that it returns the same value in the same > session. > > > > > 2009/12/8 Vladimir Zlatanov <vl...@dikini.net> > >> <jeanchristophe.min...@gmail.com> wrote: >> > I think lisp like symbols could be quite useful in the context of >> embedded >> > DSL to create ... well... symbols that can be interpreted as variables >> > in that DSL. >> >> Well for such use-case you could use either stable names, or recode >> them into a state monad- you will get either a global i.e. lisp like >> unique symbols, or their equivalent within a state context. Or some >> variation of the code posted previously in this thread.
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe