2017-05-09 7 views
0

에서 "모호한 형태 변수"를 해결 할 수 없습니다 나는이 가지고 스팍 응용 프로그램이 그것은 다음과 같은 :은 아이손과 스팍

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

을하지만, 운이 없었을 :

,369을
• 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

a <- jsonBody' :: Aeson.ObjectjsonBody'에 서명으로 Aeson.Object을 제공합니다. 하지만 작동하지 않습니다. jsonBody'은 값이 아니지만 액션 값을 얻은 것입니다! 이 서명을 a에게주고 싶을 것입니다.

{-# LANGUAGE ScopedTypeSignatures #-} 

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

정말, 당신은 아마 생각 같은 것을 필요로하지 않습니다 - 단지 당신이 실제로 사용a는 다음 컴파일러는 아마 자신에 유형을 파악 할 수 있도록!

+0

확장자를 사용하지 않으려 고하지 않고 보관하는 방법은 무엇입니까? – Jodimoro

+0

"a"를 사용하면 도움이되지 않습니다. – Jodimoro

+0

'ScopedTypeVariables'는 전적으로 해가없고, 보편적으로 지원되며, Haskell의 프로그래밍에 관계없이 유용합니다. 어쨌든 나는 확장 기능을 사용하지 않는다. 그냥 임의로 구문상의 제한을 없애기 위해 사용한다. -하지만 내가 말했듯이 : 만약 당신이'a'를 사용한다면 (실제로'show '에 피드하는 것이 아니라 값으로 사용하십시오 - 즉, 그것은 monoorphic position에서 _ 발생해야합니다) _ 다음에 명시적인 서명이 필요하지 않습니다. . 또는'show'와 같은 다형성 부분에서 사용할 수 있지만 거기에'show (a :: Aeson.Object)'라는 서명을 주면됩니다. 그건'ScopedTypeVariables'을 필요로하지 않습니다. – leftaroundabout