2012-01-24 7 views
1

ハスケル初心者はこちら。 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で動作するように変更します。私は立ち往生し続けます。 readMayNothingを返した場合、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 

mtParser (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

答えて

1

doブロックの値をバインドしませんか?

maybeCreature <- mt 
case maybeCreature of 
    Nothing -> mzero 
    Just cr -> return (Creature cr) 

またはそれに類するもの?

instance FromJSON Creature where 
    parseJSON (A.Object v) = do 
     let t = (v .: "type") :: Parser String 
      mt = readMay <$> t :: Parser (Maybe CreatureType) 
     maybeCreature <- mt 
     -- variant 1, guard 
     guard (isJust maybeCreature) 
     return (Creature $ fromJust maybeCreature) 
     -- variant 2, fromMaybe 
     fromMaybe mzero (return . Creature) maybeCreature 
     -- variant 3, case, see above 
    parseJSON _   = mzero 
+0

私は愚かな気分になるだろう。私はそれを試みたことを誓う。 –

+0

はい、それはうまく動作します| 'mt < - readMay <$>(v。:" type ")'。私はそれを考えて試しました。他の何かが間違っているはずです。これはハスケル初心者の人生です:)ありがとう。 –

+0

おそらく忘れてしまったかっこなど、あなたが前に試したときにはおそらく。いくつか小さな事が大きな影響を与えます。 :/ /それは経験で止まるわけではありませんが、それは稀です。 –

関連する問題