[Haskell-cafe] Re: The Transient monad
Ben Franksen
ben.franksen at online.de
Tue Dec 8 16:42:56 EST 2009
+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 <vlado at dikini.net>
>
>> <jeanchristophe.mincke at 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.
More information about the Haskell-Cafe
mailing list