ハスケル初心者はこちら。 JSONで "type"パラメータを渡し、読み込みを使用してHaskellのネイティブタイプに解析する必要があります。次の作品は:タイプから抜け出すには? JSON Parsing with Data.Aeson
data CreatureType = Bot | Player deriving (Generic, Typeable, Show, Read)
data Creature = Creature CreatureType deriving (Typeable, Show)
instance FromJSON Creature where
parseJSON (A.Object v) = Creature <$> read <$> (v .: "type")
parseJSON _ = mzero
私はそれは、読み取りが失敗した場合にクラッシュしないように、それは、readMay
で動作するように変更します。私は立ち往生し続けます。 readMay
がNothing
を返した場合、parseJSONはmzero
を返す必要があります。
メイン質問:readMay
を使用してこの機能を使用して、読み込みに失敗した場合にmzero
を返すにはどうすればよいですか?
instance FromJSON Creature where
parseJSON (A.Object v) = do
let t = (v .: "type") :: Parser String
mt = readMay <$> t :: Parser (Maybe CreatureType)
-- ??
-- guard -- I can't use this because it wants a Bool, and I only have Parser Bool
-- Creature <$> read <$> mt
parseJSON _ = mzero
mt
はParser (Maybe CreatureType)
次のとおりです。ここで
は、私が試したものです。 Nothing
の場合は、返品内容をどのように変更できますか? Data.Aeson
はParserの値コンストラクタをエクスポートしていないようですので、パターンマッチングは使用できません。私はパーサーの中で私に価値を与えるメソッドを見つけることができないようです、それで、一般的なhaskellメソッドがありますか?私はControl.Applicative
を見て何も見つかりませんでした。 Data.Aeson
のドキュメントは次のとおりです。 http://hackage.haskell.org/packages/archive/aeson/0.5.0.0/doc/html/Data-Aeson.html
私は愚かな気分になるだろう。私はそれを試みたことを誓う。 –
はい、それはうまく動作します| 'mt < - readMay <$>(v。:" type ")'。私はそれを考えて試しました。他の何かが間違っているはずです。これはハスケル初心者の人生です:)ありがとう。 –
おそらく忘れてしまったかっこなど、あなたが前に試したときにはおそらく。いくつか小さな事が大きな影響を与えます。 :/ /それは経験で止まるわけではありませんが、それは稀です。 –