4

私は単純な ADT と戦ってきました。JSON との間で往復させようとしましたが、どのように型をマッサージしたり変更したりしようとしても、運がありませんでした。私は何が欠けていますか?

コンパイルすると、常に同じ実行時エラーが発生します。

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

おそらく同じエラーが原因で、これを試しても「何もありません」と表示されます:decode $ encode t

これらのソースに従おうとしましたが、何を試しても、このランタイム エラーを回避できないようです: Haskell :: Aeson :: parse ADT based on field value https://www.fpcomplete.com/ユーザー/Geraldus/algebraic-data-types-adts-with-aeson

これが私が使用しているコードの1つの形式です。最初は、これを別の型に埋め込まれた型として使用しようとしましたが、それがうまくいかなかったときに、これを簡単に解析できるように「値」キーを追加しました (うまくいきませんでした)。

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
4

1 に答える 1

9

Haskell は、現在の呼び出しではそれを推測することができないため、式の結果の型についてあなたの助けが必要です:

> fromJSON $ toJSON t :: Result TemperatureType
于 2015-01-26T01:13:34.317 に答える