7

以下にリストされている私のタイプと対応する FromJSON 実装。

はaにnonEmpty変わり、が実際に空で、解析を中止しなければならない場合を正しく処理しようとしています。この解析は実際には の内部で行われます。つまり、そこから抜け出したくありませんが、戻りたい(または、他の方法でトリックを実行するものは何でも、これまでに遭遇した唯一のものです)。ハンドラーは、500 でクラッシュするのではなく、400 を正しく返します。ListMaybe NonEmptyListparseJsonBodyerror "foo"mzeromzero

以下のアプローチはコンパイルされますが、私が知る限りerror、parseJSON 内でスローされる例外とほとんど同じか、他の形式です。mzeroただし、戻ると (たとえば<*> mzero、その行の代わりに)、意図したとおりに失敗します。

import qualified Data.List.NonEmpty as NE
data GSAnswer = GSAnswer { gsAnswerQuestionId :: Int
                         , gsAnswerResponses :: NE.NonEmpty GSResponse
                         } deriving (Show, Eq)


instance FromJSON GSAnswer where
  parseJSON (Object o) =
    GSAnswer <$> o .: "question-id"
             -- how do I return mzero here based on NE.nonEmpty?
             -- this will throw an exception right now on an empty list
             <*> fmap (fromMaybe (fail "foo") . NE.nonEmpty) (o .: "responses")
  parseJSON _ = mzero

1 つのオプションは、 の結果に対して何らかの形でパターン マッチを行うことですがfmap NE.nonEmpty (o .: "responses")、そこにどのようなパターンがあるのか​​よくわかりません。Parser にはコンストラクターがないように見えませんか?

4

1 に答える 1