Haskell中什么是不安全的函数?

时间:2015-09-27 02:40:43

标签: haskell unsafe

我认为一个不安全的函数是一个函数,它会返回某个类型的值,但它实际上可以抛出异常并结束执行因此根本不返回任何值,但我不确定

或者可能是不安全的函数是一个函数,它可以返回除签名中声明的其他类型的值?那不是弱类型的函数吗?

或者Haskell中的弱类型不安全同义词?

这可能是一个愚蠢的问题,但我找不到直截了当的答案。

我检查了readLn的文档,希望看到对不安全函数的引用,但没有任何函数。

这篇文章Unsafe functions说明了打破类型系统,但没有说明以哪种方式;通过例外?,通过返回错误类型的值?

那么,Haskell中的不安全功能是什么?

2 个答案:

答案 0 :(得分:17)

Haskell有几个“不安全”的概念。

  1. 计算该值会导致I / O.这里的主要嫌疑人是unsafePerformIO。这个定义是否应该认为懒惰的I / O和unsafeInterleaveIO不安全,这有点争议。

  2. 有些东西打破了类型系统。主要嫌疑人是unsafeCoerce,但unsafePerformIO也可以这样做。

  3. 在不破坏类型系统的情况下,某些东西会打破内存安全(感谢Carl提醒我)。主要嫌疑人是unsafe数组或向量索引操作以及外部函数接口的错误使用。

  4. 计算结果取决于评估顺序。主要嫌疑人是unsafePerformIO,但unsafeInterleaveST当然可以做到。

  5. 评估可能导致异常或无限循环。这是一种相对温和的不安全......除非它不是。

  6. 有些东西打破了Haskell程序员依赖推理代码的惯例(“法则”)。这是否应被视为“不安全”是有争议的。示例:将seq应用于函数,使用coerce以更改函数的arity相对于其参考实现的方式,如果有人将seq应用于什么,则会导致问题以前是部分应用程序,现在可能是底部(在某些情况下有很好的性能原因),编写打破functor,applicative,monad,traversable等法律的类实例。期望参数满足前提条件但不检查它们是否存在(例如,快速将升序列表转换为集合或映射的函数)。

  7. 安全Haskell

    为了帮助程序员控制其中一些不安全形式,Safe Haskell系统根据他们使用的导入和语言扩展将模块分类为安全或不安全。我没有研究细节,但GarethR indicates

      

    我认为安全哈斯克尔认为你的观念1到3不安全。可能值得一读,因为安全哈斯克尔作者已明确深入考虑安全问题。

    和ØrjanJohansenindicates

      

    安全Haskell也不允许某些适合第6点的内容,例如可以绕过模块导出边界的扩展(模板Haskell,广义新类型派生)或更改导入代码的行为(规则,重叠实例)。

    程序员可以标记模块Safe以表明他们希望GHC检查它是否安全,Unsafe表示它是不安全的,或Trustworthy表示作者声称相信其API可以安全使用,尽管它的实现使用了不安全的功能。

答案 1 :(得分:0)

来自haskell FFI wiki

  

如果使用 unsafe 关键字注释外部导入声明,则向编译器指示(1)该调用不会直接或间接调用另一个Haskell函数,以及(2)您不要请注意,如果系统中任何其他正在运行的Haskell线程在呼叫期间被阻止。