по какой-то причине я не могу оборачивать голову вокруг произвольных успешных партитур в Эзоне, не создавая обрывки всей системы и вызывая утечку пространства.Разбор «остальной» объекта эзона
Вот мой вопрос:
newtype Foo = Foo
{ getFoo :: [(String, Maybe String)]
} deriving (Show, Eq)
instance ToJSON Foo where
toJSON (Foo xs) = object $
map (\(k,mv) -> T.pack k .= mv) xs
до сих пор, кодирующая Foo
прекрасно и денди. Но я хочу сделать парсер, который отклоняет пару ключей, если они существуют. Прямо сейчас, у меня есть псевдо-отказ происходит, и именно поэтому я думаю, что я плохой результат:
import qualified Data.HashMap as HM
-- the "duck-tape and chewing gum" approach
instance FromJSON Foo where
parseJSON (Object o) = Foo <$> parseJSON (Object theRest)
where
theRest = foldr HM.delete o [ "foo"
, "bar"
]
parseJSON _ = empty
Эта версия является то, что заставило меня думать, что манипулируя внутренний объект был неправильным, поскольку синтаксический анализатор может получать «больше» данных в HashMap, вне парсера (из-за ленивого байта, который подается в него), но я явно не уверен в этом. Итак, я попробовал другой подход:
instance FromJSON Foo where
parseJSON (Object o) =
(Foo . filter (\(k,_) -> k `elem` toIgnore)) <$>
parseJSON (Object o)
where
toIgnore = ["foo", "bar"]
parseJSON _ = empty
Но это также кажется причиной тупиковой/пространство утечки (не уверен точно, что диагностировать эту остановку исполнения). Каким будет рекомендованный способ принять все кроме несколько ключей объекта? Мне нужно сопоставить шаблон по структуре (Object o)
, потому что я вручную просматриваю o .: "foo"
и o .: "bar"
в другом компоненте для моего типа данных. В идеале я хотел бы просто удалить эти ключи из содержания и продолжить синтаксический анализ, потому что я уже учёл их (отсюда - «остальное»).
Есть ли надежда?
Каков ваш тестовый код, который демонстрирует утечку пространства? – ErikR
Это может быть много для компиляции, но это из [этого репозитория] (https://github.com/athanclark/contact-logger/blob/4250c8f36452934b96044918e5f5321237f45883/src/Application/Api.hs#L215) - если вы ': установите -XOverloadedStrings' и 'import Application.Api' в ghci и запустите [эту попытку разбора] (http://lpaste.net/145756), ваш компьютер раздувается. __Edit__: Предполагается, что вы используете GHC> = 7.10 –
Другое редактирование: [более точная попытка проанализировать] (http://lpaste.net/145756) –