如何在ghci中正确使用PackageImports?

时间:2017-11-12 05:47:00

标签: haskell ghci

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

相关论坛包括DRBGCrypto.RandomPackageImports。它们都提供了涉及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! 的顺序似乎很重要。

这有效(在ghci中):

: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

这也行不通:

java.lang.RuntimeException: java.lang.NoSuchMethodException: [class com.firebase.ui.firestore.FirestoreRecyclerAdapter]
    at android.arch.lifecycle.j.a(Lifecycling.java:111)
    at android.arch.lifecycle.j.c(Lifecycling.java:130)
    at android.arch.lifecycle.j.b(Lifecycling.java:119)
    at android.arch.lifecycle.j.c(Lifecycling.java:145)
    at android.arch.lifecycle.j.b(Lifecycling.java:119)
    at android.arch.lifecycle.j.a(Lifecycling.java:57)
    at android.arch.lifecycle.h$a.(LifecycleRegistry.java:346)
    at android.arch.lifecycle.h.a(LifecycleRegistry.java:162)
    at com.firebase.ui.firestore.FirestoreRecyclerAdapter.(FirestoreRecyclerAdapter.java:37)
    at com.ecom.products.ProductsAdapter.(ProductsAdapter.kt:31)
    at com.ecom.products.j.a(ProductsFragment.kt:48)

出现的错误是:

ProductsAdapter

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

2 个答案:

答案 0 :(得分:1)

也许最简单的方法是避免ghci -package "crypto-api (Crypto.Random as A)" -package "cryptonite (Crypto.Random as B)" ,而是在使用-package选项启动ghci时重命名包:

Prelude> import A
Prelude A> import B
Prelude A B>

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

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

语法Crypto.Random仅使-package "crypto-api with (Crypto.Random as A)"模块可用于ghci,而不是包中的其他模块。

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

  

我们还支持重命名模块,以防您需要同时参考   模块同时;这是通过编写OldModName来支持的   NewModName,例如-package“base(Data.Bool as Bool)。你也可以   write -package“base with(Data.Bool as Bool)包含所有的   原始绑定(例如,重命名是严格加法的)。

所以也许最好编写像PackageImports这样的选项来维护对所有模块的访问。

使用cmd.Parameters.AddWithValue("@fTyp", TypeComboBox.SelectedIndex + 1); 而不是细化和重命名模块存在的问题是它使源代码依赖于导入模块所在的精确包。如果模块更改了破坏程序的包。

答案 1 :(得分:0)

为什么你希望它能够发挥作用呢?

: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不是此讨论的一部分。据我所知,它没有任何与冲突有关的模块名称。