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

时间:2016-09-21 01:29:23

标签: haskell monads aeson

我正在使用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语句推断其类型?

1 个答案:

答案 0 :(得分:2)

parseJSON的类型是FromJSON a => Value -> Parser a,所以如果你从不使用结果,GHC就不可能弄清楚a应该是什么:它可以是任何东西使用FromJSON实例。当您将其用作返回值时,parseFoo函数的调用者将为b选择一个具体类型,该类型将用于选择parseFoo调用的实例。 / p>

另外,在这种情况下,您的return完全是多余的。您可以省略doa <-return,因为monad法律a >>= return只是a