我正在使用Artyom的Aeson教程,并编写了自己的代码片段:
parseFoo (Object obj) = do
a <- case HM.lookup "a" obj of
Just x -> parseJSON x
Nothing -> fail "no field 'a'"
return a
我注意到,如果我return True
,我会收到“含糊不清的引用”错误:
No instance for (FromJSON t0) arising from a use of ‘parseJSON’
The type variable ‘t0’ is ambiguous
Note: there are several potential instances:
...
非歧义案例的类型是
parseFoo :: FromJSON b => Value -> Parser b
我的问题是,为什么(如何)a
需要return
语句推断其类型?
答案 0 :(得分:2)
parseJSON
的类型是FromJSON a => Value -> Parser a
,所以如果你从不使用结果,GHC就不可能弄清楚a
应该是什么:它可以是任何东西使用FromJSON
实例。当您将其用作返回值时,parseFoo
函数的调用者将为b
选择一个具体类型,该类型将用于选择parseFoo
调用的实例。 / p>
另外,在这种情况下,您的return
完全是多余的。您可以省略do
,a <-
和return
,因为monad法律a >>= return
只是a
。