[Haskell-cafe] unsafeDestructiveAssign?

Max Desyatov explicitcall at googlemail.com
Tue Aug 11 12:14:20 EDT 2009


Job Vranish <jvranish at gmail.com> writes:

> Does anybody know if there is some unsafe IO function that would let me do destructive assignment?
> Something like:
>
> a = 5
> main = do
>   veryUnsafeAndYouShouldNeverEveryCallThisFunction_DestructiveAssign a 8
>   print a
>> 8

Aren't StateT or IORefs the exact thing you are looking for?

> I'm also looking for a way to make actual copies of data.
> so I could do something like this:
>
> a = Node 5 [Node 2 [], Node 5 [a]]
> main = do
>   b <- makeCopy a
>   veryUnsafeAndYouShouldNeverEveryCallThisFunction_DestructiveAssign b (Node 0 [])
>   -- 'a' is unchanged
>
> It would be even more fantastic, if the copy function was lazy.
> I think the traverse function might actually make a copy, but I would be happier with something more general (doesn't
> require membership in traversable), and more explicit (was actually designed for making real copies).

Same thing, IORefs could help you.  Anyway, I can't imagine any case
where veryUnsafeAndYouShouldNeverEveryCallThisFunction_DestructiveAssign
could be useful with its imperative semantics as you've described.  The
point is that Haskell is pure language and I use it because of this
feature (not only because of this, to be exact).  I don't want to use
any library code that brokes pure semantics and launches nuclear bombs
behind the IO monad.  GHC is smart enough these days to do all optimised
destructive assignments, copies and all that imperative stuff and there
are plenty of other ways to get a performance boost without
unsafeHorribleThings.


More information about the Haskell-Cafe mailing list