如标题中所述。有一个代码库,我在其中看到了以下语法
import "cryptonite" Crypto.Hash
(Context, Digest, SHA256, hash, hashFinalize, hashInit,
hashUpdate)
haskell wiki on imports上似乎未提及此语法。
"cryptonite"
字符串在这里做什么?
此语法从何而来?
这是Haskell2010的一部分吗?如果是,它是否在语言报告中提到?
答案 0 :(得分:3)
这是使用PackageImports
扩展名时支持的额外语法:
通过PackageImports扩展,GHC允许导入声明以 通过模块打算使用的软件包名称来限定 从进口。例如:
import "network" Network.Socket
将导入模块
Network.Socket
来自软件包network
(任何版本)。这可能用来 当多个模块中有相同模块可用时,消除导入歧义 软件包,或同时存在于当前正在构建的软件包和 外部包装。特殊的软件包名称,可以用来引用当前的 软件包正在构建。
偶尔会出现两个程序包导出具有相同名称的模块的情况。例如,hashmap
和unordered-containers
都导出 Data.HashSet
。如果同时安装了两个软件包,则我们希望在不同的软件包之间进行歧义消除。对于这种类型的导入,作者因此指定需要使用Crypto.Hash
的cryptonite
模块。
据我所知,这不是标准的Haskell(在某种意义上,其他Haskell编译器没有没有支持此功能,似乎 not 在import statement section of the Haskell 2010 report),但使用格拉斯哥Haskell编译器扩展。当然,其他编译器也可以支持此功能,但是没有此扩展名的编译器仍然可以正确地称自己为“ Haskell编译器”。为了激活此扩展,您需要使用-XPackageImports
扩展进行编译:
ghc -XPackageImports main.hs
这是一个 dynamic 标志,因此也可以在Haskell源文件的“编译指示”中指定。