在此代码段中如何推断类型?

How is type inferred in this snippet?

我正在学习 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,我会收到 "ambiguous reference" 错误:

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 语句来推断其类型?

parseJSON 的类型是 FromJSON a => Value -> Parser a,所以如果您从不使用结果,GHC 不可能弄清楚 a 应该是什么:它可以是任何东西完全有一个 FromJSON 实例。当您将它用作 return 值时,parseFoo 函数的调用者将为 b 选择一个具体类型,该类型将用于为 [=14= 选择实例] 打电话。

顺便说一句,在这种情况下,您的 return 完全多余。您可以省略 doa <-return,因为根据 monad 法则 a >>= return 只是 a