我相信一个不安全的函数是一个函数,它表示它将返回某种类型的值,但它实际上可以抛出异常并结束执行因此根本不返回任何值,但我不确定.
或者,不安全的函数是否可以返回除签名中声明的其他类型的值的函数?这不是一个弱类型的功能吗?
或者是Haskell 中弱类型和不安全的同义词?
这可能是一个愚蠢的问题,但我找不到一个直截了当的答案.
我检查了文档,readLn
希望看到对不安全函数的引用,但没有任何.
这篇文章,不安全的函数,说明了打破类型系统,但它没有指明以哪种方式; 通过例外?,通过返回错误类型的值?
那么,Haskell中的不安全功能是什么?
dfe*_*uer 17
Haskell中有几个"不安全"的概念.
计算该值会导致I/O. 这里的主要嫌疑人是unsafePerformIO
.懒惰的I/O是否有点争议unsafeInterleaveIO
,这个定义应该被认为是不安全的.
有些东西打破了类型系统.主要嫌疑人是unsafeCoerce
,但unsafePerformIO
也可以这样做.
有些东西打破了记忆安全而没有打破类型系统(感谢Carl提醒我).主要嫌疑人是unsafe
数组或向量索引操作以及外部函数接口的错误使用.
计算结果取决于评估顺序.主要嫌疑人是unsafePerformIO
,但unsafeInterleaveST
肯定可以做到这一点.
评估可能导致异常或无限循环.这是一种相对温和的不安全......除非事实并非如此.
有些东西打破了Haskell程序员依赖推理其代码的惯例("法则").这是否应被视为"不安全"是有争议的.示例:应用于seq
函数,coerce
以相对于其参考实现更改函数的arity的方式使用,如果有人适用seq
于以前的部分应用程序并且现在可能是底部(有良好的性能)则会导致问题在某些情况下执行此操作的原因),编写打破functor,applicative,monad,traversable等法律的类实例.期望参数满足前置条件但不检查它们是否存在(例如,快速将升序列表转换为集合或映射的函数).
为了帮助程序员控制其中一些不安全形式,Safe Haskell系统根据他们使用的导入和语言扩展将模块分类为安全或不安全.我没有研究过细节,但GarethR 表明了这一点
我认为安全哈斯克尔认为你的观念1到3会被认为是不安全的.可能值得一读,因为安全Haskell作者已明确深入考虑安全问题.
并与Orjan约翰森表示该
安全Haskell也不允许某些适合第6点的内容,例如可以绕过模块导出边界的扩展(模板Haskell,通用newtype派生)或更改导入代码的行为(规则,重叠实例).
程序员可以标记一个模块Safe
,表明他们希望GHC检查它是否安全,Unsafe
表明它是不安全的,或者Trustworthy
表明作者声称相信其API可以安全使用,尽管它的实现使用不安全的功能.
归档时间: |
|
查看次数: |
695 次 |
最近记录: |