gpt4 book ai didi

haskell - 如何在 ghci 中正确使用 PackageImports?

转载 作者:行者123 更新时间:2023-12-02 10:19:00 25 4
gpt4 key购买 nike

我想在 ghci 中进行测试,但我在不同包中遇到了类似命名模块的问题(这基本上是我之前问题的延续:What should I do if two modules share the same name?)

有问题的软件包是 crypto-apicryptoniteDRBG。它们都提供了涉及Crypto.Random的模块。我在 ghci 中使用 PackageImports 来解决此问题。

但是,使用 PackageImports 的顺序似乎很重要。

这有效(在 ghci 中):

:set -XPackageImports
import Crypto.Random.DRBG
import "crypto-api" Crypto.Random

这不起作用:

:set -XPackageImports
import "crypto-api" Crypto.Random
import Crypto.Random.DRBG -- Error!

这也不起作用:

:set -XPackageImports
import "crypto-api" Crypto.Random
import "DRBG" Crypto.Random.DRBG -- Error!

出现的错误是:

<interactive>:1:1: error:
Ambiguous interface for ‘Crypto.Random’:
it was found in multiple packages:
crypto-api-0.13.2 cryptonite-0.23

我做错了什么还是这是一个错误?

最佳答案

也许最简单的方法是避免 PackageImports并在启动 ghci 时使用 -package 重命名软件包选项:

ghci -package "crypto-api (Crypto.Random as A)" -package "cryptonite (Crypto.Random as B)"

进入 ghci 后,您可以导入重命名的模块:

Prelude> import A
Prelude A> import B
Prelude A B>
<小时/>

语法-package "crypto-api (Crypto.Random as A)"只制作 Crypto.Random模块可供 ghci 使用,但不适用于包中的其他模块。

根据Thinning and renaming modules GHC 用户指南部分:

We also support renaming of modules, in case you need to refer to both modules simultaneously; this is supporting by writing OldModName as NewModName, e.g. -package "base (Data.Bool as Bool). You can also write -package "base with (Data.Bool as Bool) to include all of the original bindings (e.g. the renaming is strictly additive).

所以也许最好写像 -package "crypto-api with (Crypto.Random as A)" 这样的选项保持对所有模块的访问。

<小时/>

使用PackageImports与精简和重命名模块不同,问题在于它使源代码依赖于导入模块所在的精确包。如果模块更改了程序包,则会破坏程序。

关于haskell - 如何在 ghci 中正确使用 PackageImports?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47245895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com