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

标签 haskell unsafe

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

或者,一个不安全的函数是否可以返回一个不同于签名中声明的类型的函数?那不是弱类型函数吗?

还是 Haskell 中弱类型和不安全的同义词?

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

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

这篇文章,Unsafe functions , 说了一些关于破坏类型系统的内容,但没有具体说明以何种方式;通过异常?通过返回错误类型的值?

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

最佳答案

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

  • 计算值导致 I/O。这里的主要嫌疑人是unsafePerformIO .懒惰 I/O 和 unsafeInterleaveIO 是不是有点争议。根据这个定义,应该被认为是不安全的。
  • 有些东西破坏了类型系统。主要嫌疑人是unsafeCoerce , 但是 unsafePerformIO也可以。
  • 有些东西在不破坏类型系统的情况下破坏了内存安全(感谢 Carl 提醒我)。主要嫌疑人是unsafe数组或向量索引操作以及对外部函数接口(interface)的错误使用。
  • 计算的结果取决于评估的顺序。主要嫌疑人是unsafePerformIO但是 unsafeInterleaveST当然也可以。
  • 评估可能导致异常或无限循环。这是一种相对温和的不安全……除非不是这样。
  • 某些东西打破了 Haskell 程序员用来推理他们的代码的约定(“法律”)。这是否应该被认为是“不安全的”是有争议的。示例:申请 seq到函数,使用 coerce以改变函数相对于其引用实现的数量并在有人应用 seq 时引起问题的方式对于以前的部分应用程序,现在可能是底部应用程序(在某些情况下这样做有很好的性能原因),编写破坏仿函数、应用程序、单子(monad)、可遍历等规律的类实例。期望参数满足前置条件但不检查它们是否满足(例如,快速将升序列表转换为集合或映射的函数)。

  • 安全的 Haskell

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

    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 indicates

    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 - Haskell 中的不安全函数是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32804032/

    相关文章:

    rust - 为什么不为 Box::from_raw() 调用析构函数?

    Java 转换实用程序库

    Java "unchecked or unsafe operations"和Java自己的类

    c# - 如何在 C# 中显示指针地址?

    c# - 异或链表

    haskell - 为什么这个 Haskell 程序中没有使用尾调用优化?

    bash - 在 docker-compose 命令中运行 stack build --file-watch 时如何修复 "<stdin>: hGetLine: end of file"

    haskell - 两个延续如何相互抵消?

    haskell - 如何停止 Gloss 需要增加内存量?

    haskell - 等效于具有停止条件的发电机的 Haskell