나는 단순한 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
(여기 슈퍼 초보자) expressoin을 입력 하시겠습니까? 'fromJSON $ toJSON t :: TemperatureType' – zerkms
"fromJSON"에서 기대하는 타입에 대한 목격자가 없으므로 @zerkms 권장 타입으로 할당해야합니다. 다음과 같은 경우를 생각해보십시오 : "a => String -> Maybe a"를 읽으면 이것이 왜 그렇게 될지 명확 해집니다. – bitemyapp
아니, 좋은 생각이야. '($ JSON $ fromJSON) :: Result TemperatureType' 결과는'($ encode t를 디코드합니다 :: :: 아마 TemperatureType'을 디코딩합니다. 하지만 여전히 다른 유형의 임베디드 값으로 실패하는 것 같습니다. 내가 지정할 수있는 더 많은 "수동"유형이 있어야합니다. 이상하게도 모호함없이 컴파일됩니다. – stormont