我认为一个不安全的函数是一个函数,它会返回某个类型的值,但它实际上可以抛出异常并结束执行因此根本不返回任何值,但我不确定
或者可能是不安全的函数是一个函数,它可以返回除签名中声明的其他类型的值?那不是弱类型的函数吗?
或者Haskell中的弱类型和不安全同义词?
这可能是一个愚蠢的问题,但我找不到直截了当的答案。
我检查了readLn
的文档,希望看到对不安全函数的引用,但没有任何函数。
这篇文章Unsafe functions说明了打破类型系统,但没有说明以哪种方式;通过例外?,通过返回错误类型的值?
那么,Haskell中的不安全功能是什么?
答案 0 :(得分: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 indicates
我认为安全哈斯克尔认为你的观念1到3不安全。可能值得一读,因为安全哈斯克尔作者已明确深入考虑安全问题。
和ØrjanJohansenindicates
安全Haskell也不允许某些适合第6点的内容,例如可以绕过模块导出边界的扩展(模板Haskell,广义新类型派生)或更改导入代码的行为(规则,重叠实例)。
程序员可以标记模块Safe
以表明他们希望GHC检查它是否安全,Unsafe
表示它是不安全的,或Trustworthy
表示作者声称相信其API可以安全使用,尽管它的实现使用了不安全的功能。
答案 1 :(得分:0)
如果使用 unsafe 关键字注释外部导入声明,则向编译器指示(1)该调用不会直接或间接调用另一个Haskell函数,以及(2)您不要请注意,如果系统中任何其他正在运行的Haskell线程在呼叫期间被阻止。