2015-01-26 4 views
4

나는 단순한 ADT로 싸우며, JSON으로 왕래하기 위해 노력했지만, 어떻게하면 마사지 나 수정하려고해도 운이 없었습니다. . 내가 뭘 놓치고 있니?하스켈 ADT와 에슨

는 컴파일 할 때, 나는 항상 같은 런타임 오류 얻을 : 디코딩 $ 인코딩 t 나는했습니다

: 이것은 단지 나에게 아마도 때문에 같은 오류 "아무것도"를 제공하지 않습니다 시도

> let t = Fahrenheit 
> fromJSON $ toJSON t 
Error "when expecting a(), encountered Object instead" 

을 이 소스를 따라했지만, 나는 내가 노력할 상관없이,이 런타임 오류 주위에 얻을 수없는 것 : Haskell :: Aeson :: parse ADT based on field value https://www.fpcomplete.com/user/Geraldus/algebraic-data-types-adts-with-aeson

여기 내가 사용하고 코드의 한 형태입니다. 처음에는 이것을 다른 유형에 포함 된 유형으로 사용하려고 시도했지만 작동하지 않으면 "가치"키를 추가하여이 구문 분석을 더 쉽게 만들었습니다 (운 없음).

data TemperatureType = Celsius 
        | Fahrenheit 
        deriving (Show,Read,Typeable,Data,Eq) 

-- This doesn't work either 
-- $(deriveJSON defaultOptions ''TemperatureType) 

instance ToJSON TemperatureType where 
    toJSON Fahrenheit = object [ "value" .= String "Fahrenheit" ] 
    toJSON Celsius = object [ "value" .= String "Celsius" ] 

instance FromJSON TemperatureType where 
    parseJSON (Object x) = toTemperatureType <$> x .: "value" 

toTemperatureType :: Text -> TemperatureType 
toTemperatureType "Fahrenheit" = Fahrenheit 
toTemperatureType "Celsius" = Celsius 
+1

(여기 슈퍼 초보자) expressoin을 입력 하시겠습니까? 'fromJSON $ toJSON t :: TemperatureType' – zerkms

+1

"fromJSON"에서 기대하는 타입에 대한 목격자가 없으므로 @zerkms 권장 타입으로 할당해야합니다. 다음과 같은 경우를 생각해보십시오 : "a => String -> Maybe a"를 읽으면 이것이 왜 그렇게 될지 명확 해집니다. – bitemyapp

+0

아니, 좋은 생각이야. '($ JSON $ fromJSON) :: Result TemperatureType' 결과는'($ encode t를 디코드합니다 :: :: 아마 TemperatureType'을 디코딩합니다. 하지만 여전히 다른 유형의 임베디드 값으로 실패하는 것 같습니다. 내가 지정할 수있는 더 많은 "수동"유형이 있어야합니다. 이상하게도 모호함없이 컴파일됩니다. – stormont

답변

8

하스켈은 현재에 있기 때문에 표현식 결과의 유형에 대한 당신의 도움을 필요로 그것을 추론 할 수 없습니다 전화 : 당신이 하스켈을 도움이 있다면 무엇을 말해 무엇

> fromJSON $ toJSON t :: Result TemperatureType 
+0

나는 비슷한 문제를 겪었고, 당신이 나에게 살려 주었던 좌절감을 알지 못했습니다. 고맙습니다! – gnclmorais