2016-09-21 50 views
0

我通過阿爾喬姆的埃宋教程工作,並已編碼自己這個片斷:這段代碼如何推斷類型?

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語句來推斷它的類型?

回答

2

類型的parseJSONFromJSON a => Value -> Parser a,所以如果你從來沒有使用結果,GHC不可能找出a應該是:它可以是任何東西都用FromJSON實例。當您將其用作返回值時,parseFoo函數的調用者將爲b選擇一個具體類型,該類型將用於爲parseFoo調用選擇實例。

另外,您的return在這種情況下是完全冗餘的。你可以省略doa <-return,因爲a >>= return只是由單子法規定的a