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

Lay*_*lez 9 haskell unsafe

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

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

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

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

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

这篇文章,不安全的函数,说明了打破类型系统,但它没有指明以哪种方式; 通过例外?,通过返回错误类型的值?

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

dfe*_*uer 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等法律的类实例.期望参数满足前置条件但不检查它们是否存在(例如,快速将升序列表转换为集合或映射的函数).

安全的Haskell

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

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

并与Orjan约翰森表示

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

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

  • @OrjanJohansen,我想我没有描述那么正确.与参考实现相比,它可以使用它来改变函数的arity.`fmap f(Identity x)= Identity(fx)`给`fmap` arity 2.`fmap = coerce`赋予它arity 1.所以依赖于那个有arity 2(通过使用阴暗的`seq`)的人会感到惊讶. (2认同)