无法修复"模糊类型变量"在Aeson和Spock

时间:2017-05-09 13:02:49

标签: json haskell aeson haskell-wai haskell-spock

我有一个Spock应用程序,我有这个:

    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" 

1 个答案:

答案 0 :(得分:1)

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

{-# LANGUAGE ScopedTypeSignatures #-}

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

真的,你可能不需要这样的东西 - 只要确保你实际上使用 a,那么编译器可能会自己找出它的类型!