Работаю через Haskell, и я пытаюсь научиться сериализовать в / из JSON.
Я использую aeson-0.8.0.2, и я застрял на базовом декодировании. Вот что у меня есть:
Файл игровая площадка / aeson.hs:
{-# LANGUAGE OverloadedStrings #-}
import Data.Text
import Data.Aeson
data Person = Person
{ name :: Text
, age :: Int
} deriving Show
instance FromJSON Person where
parseJSON (Object v) = Person <$>
v .: "name" <*>
v .: "age"
parseJSON _ = mzero
main = do
let a = decode "{\"name\":\"Joe\",\"age\":12}" :: Maybe Person
print "aa"
Ghc --make plays / aeson.hs дает:
[1 из 1] Основная часть компиляции (игровая площадка / aeson.hs, игровая площадка / aeson.o)
игровая площадка / aeson.hs: 13: 35: Не входит в объем: `'
игровая площадка / aeson.hs: 14: 40: Не входит в область: `<*> '
игровая площадка / aeson.hs: 17: 28: Не входит в объем: `mzero '
- Есть идеи, что я делаю не так?
- Зачем здесь нужна OverloadedString?
- Кроме того, я понятия не имею, что должны означать
<$>
,<*>
илиmzero
; Буду признателен за советы о том, где я могу прочитать об этом.
2 ответа
Вам необходимо импортировать Control.Applicative
и Control.Monad
, чтобы получить <$>
, <*>
и mzero
. <$>
просто инфиксный оператор для fmap
, а <*>
- оператор Applicative
, на данный момент вы можете рассматривать его как более обобщенную форму fmap
. mzero
определен для класса MonadPlus
, который представляет собой класс, представляющий, что Monad
выполняет операцию
mplus :: m a -> m a -> m a
И элемент «монадический ноль», называемый mzero
. Самый простой пример - для списков:
> mzero :: [Int]
[]
> [1, 2, 3] `mplus` [4, 5, 6]
[1, 2, 3, 4, 5, 6]
Здесь mzero
используется для обозначения сбоя синтаксического анализа. Для поиска символов в будущем я рекомендую использовать hoogle или Версия FP Complete. Как только вы найдете символ, прочтите документацию, исходный код и поищите примеры его использования в Интернете. Вы многому научитесь, ища его самостоятельно, хотя вам потребуется некоторое время, чтобы привыкнуть к такого рода исследованиям.
Расширение OverloadedStrings
здесь необходимо, потому что библиотека Aeson
работает с типом Text
из Data.Text
вместо встроенного типа String
. Это расширение позволяет использовать строковые литералы как Text
вместо String
, так же как числовой литерал 0
может быть Int
, Integer
, Float
, Double
, Complex
и другие типы. OverloadedStrings
заставляет строковые литералы иметь тип Text.String.IsString s => s
вместо простого String
, что упрощает использование альтернативных строковых типов y.
Для <$>
вам необходимо импортировать Control.Applicative
, а для mzero
вам необходимо импортировать Control.Monad
.
Вы можете определить это с помощью веб-версии hoogle ( http://www.haskell.org/hoogle a>) или версию командной строки:
$ hoogle '<$>'
$ hoogle mzero
Похожие вопросы
Новые вопросы
json
JSON (нотация объектов JavaScript) — это сериализуемый формат обмена данными, который может быть прочитан машиной и человеком. Не используйте этот тег для собственных объектов JavaScript или литералов объектов JavaScript. Прежде чем задать вопрос, подтвердите свой JSON с помощью валидатора JSON, такого как JSONLint (https://jsonlint.com).
<$>
и друзьях.import
. Теперь вроде компилируется.<$>
и<*>
являются частью вещи Haskell, называемой аппликативным стилем. На learnyouahaskell есть хорошее объяснение.