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

What is an unsafe function in Haskell?

我认为不安全函数是这样一种函数,它表示它将 return 某种类型的值,但它实际上可以抛出异常并结束执行,因此不会 returning任何值,但我不确定。

或者不安全函数是可以 return 签名中声明的其他类型值的函数吗?那不是 弱类型 函数吗?

或者弱类型不安全在Haskell中是同义词吗?

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

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

这篇文章 Unsafe functions 说了一些关于打破类型系统的事情,但没有具体说明是哪种方式;通过异常?,通过 returning 类型错误的值?

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

Haskell中有"unsafe"的几个概念。

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

  2. 某些东西破坏了类型系统。头号嫌疑人是unsafeCoerce,不过unsafePerformIO也能做到

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

  4. 计算结果取决于求值顺序。主要嫌疑人是unsafePerformIO,但unsafeInterleaveST当然也可以。

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

  6. 有些东西打破了约定 ("laws") Haskell 程序员依赖于推理他们的代码。这是否应该被考虑 "unsafe" 是有争议的。示例:将 seq 应用于函数,使用 coerce 以更改函数相对于其参考实现的数量,如果有人将 seq 应用于之前的内容,则会导致问题以前是部分应用程序,现在可能是底部(在某些情况下这样做有很好的性能原因),编写 class 打破函子、应用、单子、可遍历等法则的实例。期望参数满足先决条件但不检查它们是否满足(例如,快速将升序列表转换为集合或映射的函数)。

安全Haskell

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

I think your notion 1 through 3 would be considered unsafe by Safe Haskell. It may be worth reading up on it because the Safe Haskell authors have clearly thought deeply on safety.

和 Ørjan Johansen

Safe Haskell also disallows some things that fit in point 6, such as extensions that can circumvent module export boundaries (Template Haskell, generalized newtype deriving) or change the behavior of imported code (rules, overlapping instances).

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

来自 haskell FFI wiki:

If you annotate a foreign import declaration with the unsafe keyword, this indicates to the compiler that (1) the call will not invoke another Haskell function, directly or indirectly, and (2) you don't mind if any other running Haskell threads in the system are blocked for the duration of the call.