我在Data.Unique中注意到了这个习语:
uniqSource :: TVar Integer
uniqSource = unsafePerformIO (newTVarIO 0)
{-# NOINLINE uniqSource #-}
Run Code Online (Sandbox Code Playgroud)
保证只运行一次吗?
ehi*_*ird 11
在GHC,是的.1有关详细信息,请参阅文档 ; 有一个unsafeDupablePerformIO可以多次执行的变体,避免了专门用于实现此保证的开销.
请注意,unsafePerformIO创建可变变量通常是不安全的; 如文档中所述,您可以创建多态参考并使用它来实现unsafeCoerce.但是,这不是你可能偶然发生的事情,并且它不适用于有问题的代码(因为引用的类型是明确指定的).
在安全,全局包夺取这个"成语"(而在某些情况下非常有用,它通常被认为是一个反模式,而不应在正常代码中使用),在确保安全的一种方式.
另见我以前的答案上unsafePerformIO,并且必须在申请时所使用的谨慎.
1我很确定它也适用于所有其他实现; GHC需要特别注意以避免重复执行只在线程设置中,并且我不知道Haskell的任何其他线程实现.GHC是人们现在真正使用的唯一实现,但......
| 归档时间: |
|
| 查看次数: |
412 次 |
| 最近记录: |