Я не уверен, что я лаяю неправильное дерево здесь, но у меня есть определение Aeson FromJSON
, которое выглядит довольно громоздким, и мне было интересно, можно ли его превратить в нечто более кратким. Я хочу закоротить синтаксический разбор всего объекта, если вложенный анализ URI завершился с ошибкой.Flatten MonadPlus внутри Aeson Parser
data Link = Link { link :: URI
, tags :: [String]
} deriving (Show, Typeable, Eq)
instance FromJSON Link where
parseJSON :: Value -> Parser Link
parseJSON (Object o) = do
linkStr <- o .: "link"
tags' <- o .: "tags"
case parseURI linkStr of
Just l -> return $ Link l tags'
Nothing -> mzero
parseJSON _ = mzero
Тип parseURI
является parseURI :: String -> Maybe URI
и оба Maybe
и Parser
имеют MonadPlus
экземпляры. Есть ли способ составить два непосредственно и удалить уродливый оператор case в конце?
О, я был так близок к одной из моих попыток сделать это. Спасибо, это именно то решение, которое я искал! – passy