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不再msg是争论fun,你的缩进似乎被打破了)。

于 2012-06-29T12:22:36.400 回答
1

另一种可能:

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

(这里没有动态类型,尽管它看起来像 - 我们只需要让类型检查器获得更多信息,风格如何)

于 2012-06-30T03:19:00.563 回答