导入语法`import "cryptonite" Crypto.Hash` 中带引号的字符串是什么意思?

typ*_*ris 7 haskell

如标题所述。有一个代码库,在那里我看到了以下语法

import       "cryptonite" Crypto.Hash
             (Context, Digest, SHA256, hash, hashFinalize, hashInit,
             hashUpdate)
Run Code Online (Sandbox Code Playgroud)

haskell wiki 上的 import上似乎没有提到这种语法。

什么是"cryptonite"串在这里做?

这个语法从何而来?

是 Haskell2010 的一部分,如果是这样,在语言报告中的哪里提到了?

Wil*_*sem 9

这是使用PackageImports扩展时支持的额外语法:

通过 PackageImports 扩展,GHC 允许导入声明由模块要从中导入的包名称限定。例如:

import "network" Network.Socket
Run Code Online (Sandbox Code Playgroud)

将从Network.Socketnetwork(任何版本)中导入模块。当同一个模块可从多个包中使用,或者同时存在于正在构建的当前包和外部包中时,这可用于消除导入的歧义。

可用于引用当前正在构建的包的特殊包名称。

偶尔会发生两个包导出同名模块的情况。例如两者hashmapunordered-containersexport Data.HashSet。如果两个包都安装了,我们希望消除不同包之间的歧义。通过这种类型的导入,作者因此指定Crypto.Hashcryptonite需要使用的模块。

这是给我所知不是标准的Haskell的(在这个意义上,其他的Haskell编译器不具备支持这一点,似乎不是在指定的哈斯克尔2010年报告的import语句部分),但格拉斯哥Haskell编译扩展。当然其他编译器也可以支持这一点,但是没有这个扩展的编译器仍然可以正确地称自己为“Haskell 编译器”。为了激活此扩展,您需要使用-XPackageImports扩展进行编译:

ghc -XPackageImports main.hs
Run Code Online (Sandbox Code Playgroud)

这是一个动态标志,因此也可以在 Haskell 源文件的“pragma”中指定。