无法在埃宋和斯波克
问题描述:
修复“暧昧类型变量”我有一个斯波克应用程序,其中我有这样的:无法在埃宋和斯波克
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.Object
给Aeson.Object
作为签名jsonBody'
。但是这不起作用:jsonBody'
不是一个值,而是一个动作从中获得这样的值!您可能要将该签名提供给a
。
{-# LANGUAGE ScopedTypeSignatures #-}
post "/test" $ do
a :: Aeson.Object <- jsonBody'
text "test"
真的,你也许并不需要这样的东西虽然 - 只要确保你真正使用a
,那么编译器将可能是能够找出它的类型自身!
我不想使用扩展名,如何将它存档? – Jodimoro
使用“a”没有帮助。 – Jodimoro
无论如何,'ScopedTypeVariables'完全无害,通用支持,对日常Haskell编程来说非常有用。在这里,我甚至都没有使用这个扩展,只是用它来解除一些有些随意的语法限制。 - 但正如我所说:如果你使用''a''(实际上将它作为一个值使用,而不是将它馈送到'show' - 即它必须出现在单态位置中),那么你不需要任何明确的签名。或者,你可以在'show'这样的多态点中使用它,但是在那里给出一个签名:'show(a :: Aeson.Object)'。这不需要'ScopedTypeVariables'。 – leftaroundabout