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

时间:2018-08-08 09:06:30

标签: haskell

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

import       "cryptonite" Crypto.Hash
             (Context, Digest, SHA256, hash, hashFinalize, hashInit,
             hashUpdate)

haskell wiki on imports上似乎未提及此语法。

"cryptonite"字符串在这里做什么?

此语法从何而来?

这是Haskell2010的一部分吗?如果是,它是否在语言报告中提到?

1 个答案:

答案 0 :(得分:3)

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

  

通过PackageImports扩展,GHC允许导入声明以   通过模块打算使用的软件包名称来限定   从进口。例如:

import "network" Network.Socket
     

将导入模块Network.Socket   来自软件包network(任何版本)。这可能用来   当多个模块中有相同模块可用时,消除导入歧义   软件包,或同时存在于当前正在构建的软件包和   外部包装。

     

特殊的软件包名称,可以用来引用当前的   软件包正在构建。

偶尔会出现两个程序包导出具有相同名称的模块的情况。例如,hashmapunordered-containers都导出 Data.HashSet 。如果同时安装了两个软件包,则我们希望在不同的软件包之间进行歧义消除。对于这种类型的导入,作者因此指定需要使用Crypto.Hashcryptonite模块。

据我所知,这不是标准的Haskell(在某种意义上,其他Haskell编译器没有没有支持此功能,似乎 not import statement section of the Haskell 2010 report),但使用格拉斯哥Haskell编译器扩展。当然,其他编译器也可以支持此功能,但是没有此扩展名的编译器仍然可以正确地称自己为“ Haskell编译器”。为了激活此扩展,您需要使用-XPackageImports扩展进行编译:

ghc -XPackageImports main.hs

这是一个 dynamic 标志,因此也可以在Haskell源文件的“编译指示”中指定。