2

IO (Maybe a)a が のインスタンスである場所を返す (モジュール内の) 関数がありますSerialize

私のメインプログラムから、これを次のように呼び出します。

 msg <- fun token
 print msg 

そしてエラーを取得します

Ambiguous type variable `a0' in the constraints:
      (Data.Serialize.Serialize a0) arising from a use of `foo'
                                    at test_00.hs:13:15-19
      (Show a0) arising from a use of `print' at test_00.hs:17:9-13
    Probable fix: add a type signature that fixes these type variable(s)

私は問題が何であるかを正確に知っており、次のように -XScopedTypeVariables とライブラリ関数の呼び出し方法をいくつか変更して修正できます。

(msg :: Maybe String) <- cwPop token
print msg

ただし、ScopedTypeVariables を避けたいと思います。msg が show クラスのメンバーであるかどうかをテストしてから出力する方法はどこにあるのか疑問に思います。そうでない場合は、何か他のことをしてください。

4

2 に答える 2

6

<-拡張なしの右側の式に型署名を付けることができます。

msg <- fun token :: IO (Maybe String)
print msg

(私はインデントを作成したので、もはや引数ではprintありません。あなたのインデントは壊れているようです)。msgfun

于 2012-06-29T12:22:36.400 に答える
1

別の可能性:

msg <- fun token
print (msg :: Maybe String)

(どのように見えるかに関わらず、ここでは動的型付けは行われていません。型チェッカーにもう少し情報を取得する必要がありました。スタイルの問題です)

于 2012-06-30T03:19:00.563 に答える