【发布时间】:2015-04-14 04:14:34
【问题描述】:
我的类型和对应的 FromJSON 实现如下所示。
nonEmpty 将List 转换为Maybe NonEmpty,我正在尝试正确处理List 确实为空并且我必须中止解析的情况。这个解析实际上是在parseJsonBody 内部完成的,这意味着我不想通过error "foo" 摆脱它,但我想返回mzero(或者其他任何可以解决问题的方法,mzero 是到目前为止我偶然发现的唯一一件事)以便处理程序正确返回 400 而不是以 500 崩溃。
下面的方法可以编译,但据我所知,它几乎等于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
一种选择是以某种方式对fmap NE.nonEmpty (o .: "responses") 的结果进行模式匹配,但我无法完全弄清楚该模式会是什么:Parser 似乎没有任何构造函数?
【问题讨论】:
标签: parsing haskell monads applicative aeson