gpt4 book ai didi

haskell - unsafePerformIO怎么能用来写unsafeCoerce呢?

转载 作者:行者123 更新时间:2023-12-04 04:28:44 25 4
gpt4 key购买 nike

众所周知,unsafePerformIO不是类型安全的。这通常通过使用它来实现 unsafeCoerce 来演示。 :

box :: IORef a
box = unsafePerformIO (newIORef undefined)
{-# NOINLINE box #-}

unsafeCoerce :: a -> b
unsafeCoerce a = unsafePerformIO $
writeIORef box a >> readIORef box
正如我几年前所展示的,这种实现不是线程安全的。一个线程可以写入盒子,然后另一个线程可以在第一个线程可以读取之前再次写入盒子。哎呀!如何解决这个问题?

最佳答案

正如我曾经展示过的,正确的做法是通过 IORef 使用强制。生产 unsafeCoerce功能本身,而不是产生其应用的个别结果。

box :: IORef x
box = unsafePerformIO (newIORef undefined)
-- This NOINLINE is essential. If this binding is inlined,
-- then unsafeCoerce = undefined.
{-# NOINLINE box #-}

unsafeCoerce :: a -> b
unsafeCoerce = unsafePerformIO $
writeIORef box id >> readIORef box

-- Inlining this wouldn't break anything,
-- but it'd waste time with unnecessary IORef operations.
{-# NOINLINE unsafeCoerce #-}

关于haskell - unsafePerformIO怎么能用来写unsafeCoerce呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68322615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com