Я не уверен, что лаю не по тому дереву, но у меня есть определение Эсона FromJSON
, которое выглядит довольно громоздким, и мне было интересно, можно ли превратить его в нечто более краткое. Я хочу сократить синтаксический анализ всего объекта в случае сбоя вложенного синтаксического анализа URI.
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 в конце?