我最近一直在阅读unsafePerformIO
,我想问你一些事情。我对真实语言应该能够与外部环境进行交互这一事实感到满意,因此unsafePerformIO
在某种程度上是合理的。
但是,据我所知,我不知道有任何快速方法可以在不检查代码以搜索调用的情况下知道明显纯的(从类型判断)接口/库是否真的纯unsafePerformIO
(文档可以省略提一下)。我知道只有在您确定可以保证引用透明度时才应该使用它,但我还是想知道它。
我最近一直在阅读unsafePerformIO
,我想问你一些事情。我对真实语言应该能够与外部环境进行交互这一事实感到满意,因此unsafePerformIO
在某种程度上是合理的。
但是,据我所知,我不知道有任何快速方法可以在不检查代码以搜索调用的情况下知道明显纯的(从类型判断)接口/库是否真的纯unsafePerformIO
(文档可以省略提一下)。我知道只有在您确定可以保证引用透明度时才应该使用它,但我还是想知道它。
不检查源代码就没有办法。但这并不太难,因为 Haddock 提供了一个很好的链接,直接指向文档中的语法高亮定义。有关示例,请参见本页定义右侧的“来源”链接。
Safe Haskell在这里是相关的;它用于在您希望禁止使用不安全功能的情况下编译 Haskell 代码。如果一个模块使用了一个不安全的模块(例如System.IO.Unsafe
)并且没有特别标记为Trustworthy
,它将继承其不安全状态。但是使用的模块unsafePerformIO
通常会安全地使用它,从而声明自己Trustworthy
。
在您认为的情况下,使用unsafePerformIO
是不合理的。的文档unsafePerformIO
解释了这一点:它仅适用于实现者可以证明没有办法破坏引用透明性的情况,即“纯功能”语义。即,如果有人unsafePerformIO
以纯函数式程序可以检测到的方式使用(例如,编写一个其结果不仅仅取决于其参数的函数),那么这是一种不允许的用法。
如果你遇到这样的情况,最有可能的是你发现了一个错误。