如何知道一个看似纯粹的Haskell界面何时隐藏不安全的操作?

Ric*_* T. 7 haskell purely-functional unsafe-perform-io

unsafePerformIO最近一直在读,我想问你一件事.我很清楚,真正的语言应该能够与外部环境进行交互,因此unsafePerformIO有些合理.

但是,据我所知,我不知道有什么快速的方法来了解一个看似纯粹的(从类型判断)接口/库是否真的纯粹没有检查代码搜索调用unsafePerformIO(文档可以省略到提到它).我知道只有当你确定引用透明​​度得到保证时才应该使用它,但我想知道它.

ehi*_*ird 10

没有检查源代码就没办法了.但这并不太难,因为Haddock在文档中直接提供了一个很好的链接,直接指向语法高亮的定义.有关示例,请参阅本页定义右侧的"源"链接.

安全Haskell在这里是相关的; 它用于在您不想使用不安全功能的情况下编译Haskell代码.如果模块使用不安全的模块(例如System.IO.Unsafe)并且未特别标记为Trustworthy,则它将继承其不安全状态.但是使用的模块unsafePerformIO通常会安全地使用它,因此声明自己Trustworthy.


Lui*_*las 5

在您考虑的情况下,使用unsafePerformIO是不合理的.在对文档unsafePerformIO解释了这一点:它只是意味着情况下,实施者可以证明有没有办法突破的引用透明,即"纯功能性的"语义.也就是说,如果任何人unsafePerformIO以某种方式使用纯功能程序可以检测到它(例如,编写一个结果不仅仅依赖于其参数的函数),那么这是一种不允许的用法.

如果遇到这种情况,最有可能的是你发现了一个错误.

  • 从问题:"我知道只有当你确定参考透明度得到保证时才应该使用它,但我仍然想知道它." (2认同)