Disons que j'ai une fonction :
logResult :: (MonadIO m, ToJSON a) => Either MyError (Response a) -> m ()
logResult = ...
Dans cette fonction, si j'obtiens :
-
Right (Response a)
- J'appelletoJSON
pour enregistrer le résultat. -
Left MyError
- Je l'enregistre également.MyError
dispose déjà d'unToJSON
définie.
Je veux maintenant écrire une fonction d'aide :
logError :: (MonadIO m) :: MyError -> m ()
logError err = logResult (Left err)
Mais GHC se plaint de quelque chose qui ressemble à ce qui suit :
• Could not deduce (ToJSON a0) arising from a use of ‘logResult’
from the context: MonadIO m
bound by the type signature for:
logError :: forall (m :: * -> *).
MonadIO m =>
L.Logger
-> Wai.Request
-> MyError
-> m ()
...
...
The type variable ‘a0’ is ambiguous
Je comprends que l'erreur est due au fait que logResult
doit garantir que le a
en Response a
doit disposer d'un ToJSON
définie. Mais en logError
Je transmets explicitement Left MyError
. Cela ne devrait-il pas désambiguïser ?
Existe-t-il un moyen d'écrire le logError
fonction d'aide ?
PS : J'ai simplifié les signatures de type dans l'exemple. Le message d'erreur contient tous les détails.