无法在埃宋和斯波克

无法在埃宋和斯波克

问题描述:

修复“暧昧类型变量”我有一个斯波克应用程序,其中我有这样的:无法在埃宋和斯波克

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

它抛出一个异常:

• 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 

因此我试着解决它是这样的:

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

,但有没有运气:

• 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 

如何解决?

更新:

不能解决问题:

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

a <- jsonBody' :: Aeson.ObjectAeson.Object作为签名jsonBody'。但是这不起作用:jsonBody'不是一个值,而是一个动作从中获得这样的值!您可能要将该签名提供给a

{-# LANGUAGE ScopedTypeSignatures #-} 

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

真的,你也许并不需要这样的东西虽然 - 只要确保你真正使用a,那么编译器将可能是能够找出它的类型自身!

+0

我不想使用扩展名,如何将它存档? – Jodimoro

+0

使用“a”没有帮助。 – Jodimoro

+0

无论如何,'ScopedTypeVariables'完全无害,通用支持,对日常Haskell编程来说非常有用。在这里,我甚至都没有使用这个扩展,只是用它来解除一些有些随意的语法限制。 - 但正如我所说:如果你使用''a''(实际上将它作为一个值使用,而不是将它馈送到'show' - 即它必须出现在单态位置中),那么你不需要任何明确的签名。或者,你可以在'show'这样的多态点中使用它,但是在那里给出一个签名:'show(a :: Aeson.Object)'。这不需要'ScopedTypeVariables'。 – leftaroundabout