2011-09-17 4 views
0

je tente de match de motif sur un type dans une déclaration de cas comme les suivants:Impossible de déduire le type

result <- action 
case result of 
    Success _ -> do something 
    Failure e -> case e of 
       MyException myField -> do take another action 
       _ -> ... 

Le compilateur ne peut pas en déduire ~ e MyException que je comprends. Ma question est quelle autre information dois-je fournir au compilateur pour pouvoir correspondre à mon type d'exception. Dans ce cas particulier, je sais que s'il y a un échec, le type retourné sera MyException.

EDIT:

Le type de résultat (du paquet Aws) est: (Transaction ra, ConfigurationFetch (Info r)) => Configuration -> r -> IO (Réponse (ResponseMetadata un) a)

a provient de Data.Attempt qui est soit un succès ou un échec.

+1

Quel est le type de 'résultat'? Si vous ne l'avez pas écrit explicitement, vous pouvez faire ': t action' sur ghci pour le trouver. – hugomg

Répondre

3

En supposant que vous utilisez des exceptions extensibles (ce qui est la valeur par défaut dans son récent GHC), le résultat est probablement quelque chose comme

data Result = Success MySuccess | Failure SomeException 

Vous devez convertir le SomeException à votre propre type d'exception. Ceci est fait avec la fonction toException :: Exception e => SomeException -> Maybe e. Ensuite, vous gérer cela comme:

Failure e -> case toException e of 
       Just (MyException myField) -> do take another action 
       _ -> ... 

Bien sûr, cela suppose que je ne me trompe pas sur votre type Result.

Questions connexes