2011-12-30 4 views
2

私は以下のコードからエラーあいまいなタイプの変数 `P0' を

Ambiguous type variable `p0' in the constraints: 
     (Show p0) arising from a use of `print' at cwqr_0003.hs:31:6-10 
     (Ord p0) arising from a use of `PSQ.lookup' 

を取得します。

これを分析する方法はわかりません。これはGHCやモジュールの1つに問題がありますか? putStrの代わりにprintを試してみると、予想されるタイプに関連するエラーがp0ではなくむしろ文字列になります。私はfromMaybeをしようとすると、それは私にエラーメッセージが実際にそれを言って正確に何を意味

import qualified Data.PSQueue as PSQ 
import Data.Maybe 
import Data.Label 
import Control.Category 
import Prelude hiding ((.)) 

--some tested code omitted here 

let r = PSQ.lookup test' q 
--putStr (show (r :: String)) 
print (r) 
+0

知ることは非常に興味深いのは、実際のだろう'test''と' q'の型は問題があるところにあると思われます。 – mrueg

+0

test 'はタプルで、q a PSQ –

+0

しかし何のタプル? (タプルのコンポーネントの型は何ですか?) 'PSQ.lookup'の結果が' Maybe p'型であるため、あなたのコメントアウトされた行は機能しませんが、結果は文字列でなければならないと言いますどちらも真実であることはできません。
さらに、 'PSQ'は半分の型です:' PSQ'のキーと値の型も型の一部です。 – mrueg

答えて

4

fromMaybeするデフォルト値Iがお送りliteral zeroに関連するエラーを与える:あなたがあいまいなタイプを持っています。それはどうですか?通常、多態性の結果を生成するものがあるため、中間結果の型が不明であるように、その結​​果に多相引数をとる関数を適用します。

単純な多型では、あいまいさは問題ではありません。何かのリストを作成して長さを取ると、リスト要素のタイプが何であるかを知る必要はありません。

Showなどのタイプクラスを使用することがあいまいな場合 - printの場合 - GHCはどのインスタンスを選択するかわからないため、GHCがスタックされています。

多態性を保持する代わりに単一の型を強制的に選択するように、特定の定義を強制的に単相性にする必要がある場合があります(特に指定しない限り)。私はそれがあなたの問題かもしれないと思うが、私はあなたが削除した文脈なしでは伝えることができない。後者は、次の定義説明するために

:なしタイプの署名で...

foo = print 

を、このようなエラーが発生します。

Test.hs:12:7: 
    Ambiguous type variable `a0' in the constraint: 
     (Show a0) arising from a use of `print' 
    Possible cause: the monomorphism restriction applied to the following: 
     foo :: a0 -> IO() (bound at Test.hs:12:1) 
    Probable fix: give these definition(s) an explicit type signature 
        or use -XNoMonomorphismRestriction 
    In the expression: print 
    In an equation for `foo': foo = print 
+0

「PutStr(show(r :: String))」によって解決されるべきではないことを理解していますか?前述のように、これは、PSQ.lookup of dedがp0を返す可能性があるため、おそらくwのエラーに陥ります。もし私が0からrでそれを解こうとすると、リテラルゼロに関連するエラーが返されます。 –

+0

@JFritsch:タイプアノテーションはあいまいさを解決しますが、その表現は私には疑わしいです。 'fromMaybe 0'はあなたが数字を持っていると思うようにしますが、そこに' String'を使って文字列を 'show'してしまいました。私はあなたの完全なコードを見ることなく確信していませんが、おそらく 'print(fromMaybe 0 r :: Integer)'のようなものが欲しいでしょうか? –

+0

解決済み。 print'(fromMaybe 'A' r :: String) 'を実行します。これは意図したとおりに機能しますが、あなたが正しいです、すべてのことが "魚介類"です。 –

関連する問題