看看hackage中的一些代码,我偶然发现了Safe和Trustworthy扩展。
广义上(或者也确切地说.)是什么意思?在什么时候使用它们,什么时候不使用,有一个好的经验法则吗?
发布于 2020-05-07 10:29:00
安全Haskell在本质上是Haskell语言的一个子集。它旨在禁用经常使用的某些“技巧”,例如unsafePerformIO :: IO a -> a,此外,它还(旨在)保证您不会以某种方式访问某个模块的私有函数、数据构造函数等,从而阻止这些模块的访问。简而言之,安全Haskell保证三件事:
安全模块必须遵循这些限制,而且只能使用安全模块。当然,安全模块并不意味着它使用的代码是正确的,或者IO操作不能是恶意的。但是它有一些保证,因为如果一个函数的类型没有IO,那么通常该模块不应该以不安全的方式执行IO。
在安全Haskell中,某些扩展,如TemplateHaskell和指定{-# RULES … #-}实用程序是不允许的。其他扩展(如DeriveDataTypeable )是允许的,但前提是使用deriving子句生成实例,因此不能生成自定义实例。
然而,有些模块需要使用扩展才能正常工作。在这种情况下,作者可以将模块标记为Trustworthy。这意味着作者声称该模块公开了一个安全的API,但它内部需要处理一些不安全的扩展、转换等,因此编译器无法保证安全性。
这些扩展记录在文献资料中。
Safe扩展引入了以下三种语言标志:
XSafe -启用安全语言方言,请GHC保证信任。安全语言方言要求所有导入都是可信的,否则将发生编译错误。XTrustworthy -意味着虽然这个模块可能在内部调用不安全的函数,但是模块的作者声称它导出了一个不能以不安全的方式使用的API。这不启用安全语言,也不对允许的Haskell代码设置任何限制。信任保证是由模块作者提供的,而不是GHC。如果导入的模块不受信任,带有安全关键字的导入语句将导致编译错误。没有关键字的import语句会像往常一样运行,并且可以导入任何模块,无论是否可信。XUnsafe --将正在编译的模块标记为不安全的,以便使用-XSafe编译的模块不能导入它。https://stackoverflow.com/questions/61655158
复制相似问题