2016-09-21 1 views
0

Je travaille dans le tutoriel Aeson de Artyom, et moi-même avons codé cet extrait:Comment le type est-il déduit dans cet extrait?

parseFoo (Object obj) = do 
    a <- case HM.lookup "a" obj of 
     Just x -> parseJSON x 
     Nothing -> fail "no field 'a'" 

    return a 

J'ai remarqué que si je return True, je reçois une erreur « référence ambiguë »:

No instance for (FromJSON t0) arising from a use of ‘parseJSON’ 
The type variable ‘t0’ is ambiguous 
Note: there are several potential instances: 
... 

le type de cas non ambiguë est

parseFoo :: FromJSON b => Value -> Parser b 

Ma question est, pourquoi (comment) ne a besoin de la return déclaration à déduire son type?

Répondre

2

Le type de parseJSON est FromJSON a => Value -> Parser a, donc si vous n'utilisez jamais le résultat, GHC ne peut peut-être comprendre ce que a est censé être: il pourrait être quoi que ce soit avec une instance FromJSON. Lorsque vous l'utilisez comme valeur de retour, l'appelant de la fonction parseFoo sélectionne un type concret pour b, qui sera utilisé pour sélectionner l'instance pour l'appel parseFoo. En outre, return est totalement redondant dans ce cas. Vous pouvez omettre le do, le a <-, et le return, puisque a >>= return est juste a par les lois de la monade.