1

私はlist-triesパッケージを使用しています:

import qualified Data.ListTrie.Patricia.Map as TM
import qualified Data.ListTrie.Patricia.Set as TS
import qualified Data.Map as Map

次のように、トライセットで構成されるトライマップに格納したい文字列のリストがあります。

-- vocabs :: [String]
trie = TM.fromListWith' (flip TS.union) $ map (\v->(sort v, TS.singleton v)) vocabs

(これは、外側のトライで一連の文字を検索し、結果のトライで特定の文字の組み合わせを検索するためのものです)。

使用するマップのタイプをどこにも指定していないため、トライが持つ正確なタイプを Haskell が認識していないことは理解できます。宣言を追加することでこれができると思いました

trie :: TM.TrieMap Map.Map Char (TS.TrieSet Map.Map Char)

しかし、それだけでは十分ではないようです。次のようなエラーメッセージがまだ表示されます

(Data.ListTrie.Base.Map.Map Map.Map Char) の使用から生じるインスタンスなしTrieM.fromListWith'

考えられる修正: のインスタンス宣言を追加します (Data.ListTrie.Base.Map.Map Map.Map Char)

式では:TrieM.fromListWith' TrieS.union

式: …</p>

TS.singletonTM.lookupTS.memberおよびの同様のものTS.findMin

私は実際の問題を理解していないようで、[インライン]式に型宣言を追加する方法もわかりません(何度か見ましたが、構文がわかりませんでした)。助けていただけませんか?

4

1 に答える 1

1

問題を再現できません。

の署名がないと、質問に記載されている理由と、考えられる原因(実際には原因であり、単相性の制限です)と2つの可能性のある、あいまいな型変数エラー(2つ)が発生しtrieます修正(単相制限を無効にするとコンパイルされますが、明示的な型シグネチャを指定する方が適切です)。エラーメッセージは、過度に関心のある魂のために以下に追加されます(7.6.1からです)。

型署名を使用すると、クリーンにコンパイルされます。

それを踏まえると、問題を確実に診断することはできませんが、発生したエラーメッセージと一緒に経験することで、考えられる原因がわかります。

必要なインスタンスがスコープ内にないという非常に具体的なメッセージが表示されました。

No instance for (Data.ListTrie.Base.Map.Map Map.Map Char) arising from a use of TrieM.fromListWith'

Possible fix: add an instance declaration for (Data.ListTrie.Base.Map.Map Map.Map Char)

一方、list-triesパッケージは、そのようなインスタンスを明示的に提供します。

このような状況の一般的な原因は、同じパッケージの異なるバージョンに由来する2つの異なるクラスまたは2つの異なるタイプが関係していることです。

この場合、list-triesあるバージョンに対してビルドしcontainers、後で別のバージョンのをインストールし、新しいパッケージバージョンからタイプをインポートし、のインスタンスcontainersimport qualified Data.Map as Map古いバージョン用である可能性があります。Map.Maplist-tries

で複数のバージョンがcontainersインストールされているかどうかを確認します

ghc-pkg list containers

に依存しているバージョンを確認してcontainersくださいlist-tries

ghc-pkg describe list-tries

そのdepends出力のフィールドには、次のようなものが表示されます

containers-0.5.0.0-e49be7a240765a4edc5c09f677ec6a81

containersパッケージのバージョンとパッケージのABIハッシュのリストはで作成list-triesされました。

バージョンがインストールした最新バージョンに対応していない場合、フラグを使用して直接、またはファイルを介して間接的にGHCを呼び出すときに、使用するバージョンが明示的に指定されてcontainersいない限り、上記の状況が発生します。containers-package.cabal

その場合は、次のことができます

  • containers使用するたびに使用するバージョンを明示的に指定するlist-tries
  • 新しいバージョンの登録を解除しcontainersます(他のパッケージが破損する可能性があります)
  • list-tries新しいバージョンに対して再構築しますcontainers

TrieTest.hs:12:8:
    No instance for (Data.ListTrie.Base.Map.Map map0 Char)
      arising from a use of TM.fromListWith'
    The type variable `map0' is ambiguous
    Possible cause: the monomorphism restriction applied to the following:
      trie :: TM.TrieMap map0 Char (TS.TrieSet map1 Char)
        (bound at TrieTest.hs:12:1)
    Probable fix: give these definition(s) an explicit type signature
                  or use -XNoMonomorphismRestriction
    Note: there are several potential instances:
      instance Eq k =>
               Data.ListTrie.Base.Map.Map Data.ListTrie.Base.Map.AList k
        -- Defined in `Data.ListTrie.Base.Map'
      instance Ord k => Data.ListTrie.Base.Map.Map Map.Map k
        -- Defined in `Data.ListTrie.Base.Map'
      instance Enum k =>
               Data.ListTrie.Base.Map.Map Data.ListTrie.Base.Map.WrappedIntMap k
        -- Defined in `Data.ListTrie.Base.Map'
    Possible fix:
      add an instance declaration for
      (Data.ListTrie.Base.Map.Map map0 Char)
    In the expression: TM.fromListWith' (flip TS.union)
    In the expression:
      TM.fromListWith' (flip TS.union)
      $ map (\ v -> (sort v, TS.singleton v)) vocabs
    In an equation for `trie':
        trie
          = TM.fromListWith' (flip TS.union)
            $ map (\ v -> (sort v, TS.singleton v)) vocabs

TrieTest.hs:12:31:
    No instance for (Data.ListTrie.Base.Map.Map map1 Char)
      arising from a use of `TS.union'
    The type variable `map1' is ambiguous
    Possible cause: the monomorphism restriction applied to the following:
      trie :: TM.TrieMap map0 Char (TS.TrieSet map1 Char)
        (bound at TrieTest.hs:12:1)
    Probable fix: give these definition(s) an explicit type signature
                  or use -XNoMonomorphismRestriction
    Note: there are several potential instances:
      instance Eq k =>
               Data.ListTrie.Base.Map.Map Data.ListTrie.Base.Map.AList k
        -- Defined in `Data.ListTrie.Base.Map'
      instance Ord k => Data.ListTrie.Base.Map.Map Map.Map k
        -- Defined in `Data.ListTrie.Base.Map'
      instance Enum k =>
               Data.ListTrie.Base.Map.Map Data.ListTrie.Base.Map.WrappedIntMap k
        -- Defined in `Data.ListTrie.Base.Map'
    Possible fix:
      add an instance declaration for
      (Data.ListTrie.Base.Map.Map map1 Char)
    In the first argument of `flip', namely `TS.union'
    In the first argument of TM.fromListWith', namely `(flip TS.union)'
    In the expression: TM.fromListWith' (flip TS.union)
于 2012-12-03T23:07:27.853 に答える