2017-05-09 4 views
0

J'ai une application Spock où j'ai ceci:Impossible de fixer "variable de type Ambigu" dans Aeson et Spock

post "/test" $ do 
     a <- jsonBody' 
     text "test" 

Il lance une exception:

• Ambiguous type variable ‘a0’ arising from a use of ‘jsonBody'’ 
     prevents the constraint ‘(Aeson.FromJSON a0)’ from being solved. 
     Probable fix: use a type annotation to specify what ‘a0’ should be. 
     These potential instances exist: 
     instance Aeson.FromJSON Aeson.DotNetTime 

ainsi que je l'ai essayé la résolution comme ceci:

post "/test" $ do 
     a <- jsonBody' :: Aeson.Object 
     text "test" 

mais ont pas eu de chance:

• Couldn't match type ‘ActionCtxT 
          () (WebStateM() MySession MyAppState)()’ 
        with ‘unordered-containers-0.2.8.0:Data.HashMap.Base.HashMap 
          T.Text b0’ 
     Expected type: hvect-0.4.0.0:Data.HVect.HVectElim 
         '[] (SpockActionCtx()() MySession MyAppState()) 
     Actual type: unordered-containers-0.2.8.0:Data.HashMap.Base.HashMap 
         T.Text b0 

Comment le réparer?

mise à jour:

cela ne résout pas le problème:

 a <- jsonBody' :: Aeson.Object 
     --a :: Aeson.Object <- jsonBody' 
     let b = show a -- using a 
     text "fdsfd" 

Répondre

1

a <- jsonBody' :: Aeson.Object donne Aeson.Object que la signature à jsonBody'. Mais cela ne fonctionne pas: jsonBody' n'est pas une valeur mais une action à partir de laquelle une telle valeur est obtenue! Vous voulez probablement donner cette signature à a.

{-# LANGUAGE ScopedTypeSignatures #-} 

post "/test" $ do 
    a :: Aeson.Object <- jsonBody' 
    text "test" 

Vraiment, vous ne avez probablement pas besoin de quelque chose comme ça si - assurez-vous simplement en fait utilisationa, le compilateur sera probablement en mesure de déterminer son type sur son propre!

+0

Je ne veux pas utiliser l'extension, comment l'archiver sans elle? – Jodimoro

+0

en utilisant "a" n'aide pas. – Jodimoro

+0

'ScopedTypeVariables' est totalement inoffensif, universellement supporté et utile pour la programmation quotidienne de Haskell. Ici, je n'utilise même pas cette extension de toute façon, il suffit de l'utiliser pour lever une restriction syntaxique quelque peu arbitraire. - Mais comme je l'ai dit: si vous utilisez _ a_ (utilisez-le en tant que valeur, pas simplement pour le montrer à 'show' - c'est-à-dire dans une position _monomorphic_) alors vous n'avez pas besoin de signature explicite . Alternativement, vous pouvez l'utiliser dans un endroit polymorphe comme 'show' mais y donner une signature:' show (a :: Aeson.Object) '. Cela n'a pas besoin de 'ScopedTypeVariables'. – leftaroundabout