簡體   English   中英

如何在ghci中正確使用PackageImports?

[英]How do I use PackageImports properly in ghci?

我想在ghci中進行測試,並且我遇到了在不同包中使用類似命名模塊的問題(這基本上是我之前問題的延續: 如果兩個模塊共享相同的名稱,我該怎么辦?

有問題的軟件包是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 ,而是在使用-package選項啟動ghci時重命名包:

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)"只使得ghci可以使用Crypto.Random模塊,但不能使用包中的其他模塊。

根據GHC用戶指南的細化和重命名模塊部分:

我們還支持重命名模塊,以防您需要同時參考這兩個模塊; 這是通過將OldModName寫為NewModName來支持的,例如-package“base(Data.Bool as Bool)。您還可以使用(Data.Bool作為Bool)編寫”package“包含所有原始綁定(例如重命名為嚴格添加劑)。

所以也許最好編寫像-package "crypto-api with (Crypto.Random as A)"這樣的選項-package "crypto-api with (Crypto.Random as A)"來維護對所有模塊的訪問。


使用PackageImports而不是細化和重命名模塊存在的問題是它使源代碼依賴於導入模塊所在的精確包。 如果模塊更改了破壞程序的包。

為什么你會期望這個工作呢?

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

您已從同一包中導入DRBG模塊兩次。 根據你的問題,我認為你想要從crypto-api和cryptonite獲取Crypto.Random模塊,但我沒有看到任何嘗試在這里使用cryptonite。

我們很清楚,我可以重現我認為你通過GHCi獲得的錯誤:

Prelude> :set -XPackageImports
Prelude> import "crypto-api" Crypto.Random as OriginalRandom
Prelude OriginalRandom> import "cryptonite" Crypto.Random as ConflictRandom

<interactive>:1:1: error:
    Ambiguous module name ‘Crypto.Random’:
      it was found in multiple packages:
      crypto-api-0.13.2 cryptonite-0.24

但是當你從文件加載它時它都可以工作,所以這只是一個bug,可以避免:

% cat t.hs
{-# LANGUAGE PackageImports #-}

import "crypto-api" Crypto.Random as OriginalRandom
import "cryptonite" Crypto.Random as ConflictRandom
import Crypto.Random.DRBG -- This only appears in one package
% ghci t.hs
GHCi, version 8.2.1: http://www.haskell.org/ghc/  :? for help
Loaded GHCi configuration from /Users/tommd/.ghci
[1 of 1] Compiling Main             ( t.hs, interpreted )
Ok, 1 module loaded.
*Main>

請注意,DRBG不是此討論的一部分。 據我所知,它沒有任何與沖突有關的模塊名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM