我在Haskell图书馆的限制区中徘徊,发现了这两个卑鄙的咒语:
{- System.IO.Unsafe -}
unsafeDupablePerformIO :: IO a -> a
unsafeDupablePerformIO (IO m) = case runRW# m of (# _, a #) -> a
{- Data.ByteString.Internal -}
accursedUnutterablePerformIO :: IO a -> a
accursedUnutterablePerformIO (IO m) = case m realWorld# of (# _, r #) -> r
但是,实际差异似乎只是在runRW#
和($ realWorld#)
之间。我对他们在做什么有一些基本的想法,但是我并没有真正理解使用它们之间的真正后果。有人可以告诉我有什么区别吗?
考虑一个简化的字节串库。您可能具有由长度和分配的字节缓冲区组成的字节字符串类型: